mirror of
https://github.com/wren-lang/wren.git
synced 2026-01-18 13:49:59 +01:00
Deploy to GitHub Pages:
This commit is contained in:
@ -114,9 +114,9 @@ fiber for every line of code you type in. </p>
|
||||
<p>All Wren code runs within the context of a fiber. When you first start a Wren
|
||||
script, a main fiber is created for you automatically. You can spawn new fibers
|
||||
using the Fiber class’s constructor: </p>
|
||||
<div class="codehilite"><pre><span></span>var fiber = Fiber.new {
|
||||
System.print("This runs in a separate fiber.")
|
||||
}
|
||||
<div class="codehilite"><pre><span class="k">var</span> <span class="n">fiber</span> <span class="o">=</span> <span class="vg">Fiber</span><span class="o">.</span><span class="n">new</span> <span class="p">{</span>
|
||||
<span class="vg">System</span><span class="o">.</span><span class="n">print</span><span class="p">(</span><span class="s">"This runs in a separate fiber."</span><span class="p">)</span>
|
||||
<span class="p">}</span>
|
||||
</pre></div>
|
||||
|
||||
|
||||
@ -126,20 +126,20 @@ fiber does not immediately run it. It just wraps the function and sits there,
|
||||
waiting to be activated. </p>
|
||||
<h2>Invoking fibers <a href="#invoking-fibers" name="invoking-fibers" class="header-anchor">#</a></h2>
|
||||
<p>Once you’ve created a fiber, you run it by calling its <code>call()</code> method: </p>
|
||||
<div class="codehilite"><pre><span></span>fiber.call()
|
||||
<div class="codehilite"><pre><span class="n">fiber</span><span class="o">.</span><span class="n">call</span><span class="p">()</span>
|
||||
</pre></div>
|
||||
|
||||
|
||||
<p>This suspends the current fiber and executes the called one until it reaches the
|
||||
end of its body or until it passes control to yet another fiber. If it reaches
|
||||
the end of its body, it is considered <em>done</em>: </p>
|
||||
<div class="codehilite"><pre><span></span>var fiber = Fiber.new {
|
||||
System.print("It's alive!")
|
||||
}
|
||||
<div class="codehilite"><pre><span class="k">var</span> <span class="n">fiber</span> <span class="o">=</span> <span class="vg">Fiber</span><span class="o">.</span><span class="n">new</span> <span class="p">{</span>
|
||||
<span class="vg">System</span><span class="o">.</span><span class="n">print</span><span class="p">(</span><span class="s">"It's alive!"</span><span class="p">)</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
System.print(fiber.isDone) //> false
|
||||
fiber.call() //> It's alive!
|
||||
System.print(fiber.isDone) //> true
|
||||
<span class="vg">System</span><span class="o">.</span><span class="n">print</span><span class="p">(</span><span class="n">fiber</span><span class="o">.</span><span class="n">isDone</span><span class="p">)</span> <span class="output">false</span>
|
||||
<span class="n">fiber</span><span class="o">.</span><span class="n">call</span><span class="p">()</span> <span class="output">It's alive!</span>
|
||||
<span class="vg">System</span><span class="o">.</span><span class="n">print</span><span class="p">(</span><span class="n">fiber</span><span class="o">.</span><span class="n">isDone</span><span class="p">)</span> <span class="output">true</span>
|
||||
</pre></div>
|
||||
|
||||
|
||||
@ -155,17 +155,17 @@ as one function calling another. </p>
|
||||
<em>back</em> to the fiber that ran it, but <em>remembers where it is</em>. The next time the
|
||||
fiber is called, it picks up right where it left off and keeps going. </p>
|
||||
<p>You make a fiber yield by calling the static <code>yield()</code> method on Fiber: </p>
|
||||
<div class="codehilite"><pre><span></span>var fiber = Fiber.new {
|
||||
System.print("Before yield")
|
||||
Fiber.yield()
|
||||
System.print("Resumed")
|
||||
}
|
||||
<div class="codehilite"><pre><span class="k">var</span> <span class="n">fiber</span> <span class="o">=</span> <span class="vg">Fiber</span><span class="o">.</span><span class="n">new</span> <span class="p">{</span>
|
||||
<span class="vg">System</span><span class="o">.</span><span class="n">print</span><span class="p">(</span><span class="s">"Before yield"</span><span class="p">)</span>
|
||||
<span class="vg">Fiber</span><span class="o">.</span><span class="n">yield</span><span class="p">()</span>
|
||||
<span class="vg">System</span><span class="o">.</span><span class="n">print</span><span class="p">(</span><span class="s">"Resumed"</span><span class="p">)</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
System.print("Before call") //> Before call
|
||||
fiber.call() //> Before yield
|
||||
System.print("Calling again") //> Calling again
|
||||
fiber.call() //> Resumed
|
||||
System.print("All done") //> All done
|
||||
<span class="vg">System</span><span class="o">.</span><span class="n">print</span><span class="p">(</span><span class="s">"Before call"</span><span class="p">)</span> <span class="output">Before call</span>
|
||||
<span class="n">fiber</span><span class="o">.</span><span class="n">call</span><span class="p">()</span> <span class="output">Before yield</span>
|
||||
<span class="vg">System</span><span class="o">.</span><span class="n">print</span><span class="p">(</span><span class="s">"Calling again"</span><span class="p">)</span> <span class="output">Calling again</span>
|
||||
<span class="n">fiber</span><span class="o">.</span><span class="n">call</span><span class="p">()</span> <span class="output">Resumed</span>
|
||||
<span class="vg">System</span><span class="o">.</span><span class="n">print</span><span class="p">(</span><span class="s">"All done"</span><span class="p">)</span> <span class="output">All done</span>
|
||||
</pre></div>
|
||||
|
||||
|
||||
@ -177,35 +177,35 @@ the mercy of a thread scheduler playing Russian roulette with your code. </p>
|
||||
<em>data</em>. When you call a fiber, you can optionally pass a value to it. </p>
|
||||
<p>If you create a fiber using a function that takes a parameter, you can pass a
|
||||
value to it through <code>call()</code>: </p>
|
||||
<div class="codehilite"><pre><span></span>var fiber = Fiber.new {|param|
|
||||
System.print(param)
|
||||
}
|
||||
<div class="codehilite"><pre><span class="k">var</span> <span class="n">fiber</span> <span class="o">=</span> <span class="vg">Fiber</span><span class="o">.</span><span class="n">new</span> <span class="p">{</span><span class="o">|</span><span class="n">param</span><span class="o">|</span>
|
||||
<span class="vg">System</span><span class="o">.</span><span class="n">print</span><span class="p">(</span><span class="n">param</span><span class="p">)</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
fiber.call("Here you go") //> Here you go
|
||||
<span class="n">fiber</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="s">"Here you go"</span><span class="p">)</span> <span class="output">Here you go</span>
|
||||
</pre></div>
|
||||
|
||||
|
||||
<p>If the fiber has yielded and is waiting to resume, the value you pass to call
|
||||
becomes the return value of the <code>yield()</code> call when it resumes: </p>
|
||||
<div class="codehilite"><pre><span></span>var fiber = Fiber.new {|param|
|
||||
System.print(param)
|
||||
var result = Fiber.yield()
|
||||
System.print(result)
|
||||
}
|
||||
<div class="codehilite"><pre><span class="k">var</span> <span class="n">fiber</span> <span class="o">=</span> <span class="vg">Fiber</span><span class="o">.</span><span class="n">new</span> <span class="p">{</span><span class="o">|</span><span class="n">param</span><span class="o">|</span>
|
||||
<span class="vg">System</span><span class="o">.</span><span class="n">print</span><span class="p">(</span><span class="n">param</span><span class="p">)</span>
|
||||
<span class="k">var</span> <span class="n">result</span> <span class="o">=</span> <span class="vg">Fiber</span><span class="o">.</span><span class="n">yield</span><span class="p">()</span>
|
||||
<span class="vg">System</span><span class="o">.</span><span class="n">print</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
fiber.call("First") //> First
|
||||
fiber.call("Second") //> Second
|
||||
<span class="n">fiber</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="s">"First"</span><span class="p">)</span> <span class="output">First</span>
|
||||
<span class="n">fiber</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="s">"Second"</span><span class="p">)</span> <span class="output">Second</span>
|
||||
</pre></div>
|
||||
|
||||
|
||||
<p>Fibers can also pass values <em>back</em> when they yield. If you pass an argument to
|
||||
<code>yield()</code>, that will become the return value of the <code>call()</code> that was used to
|
||||
invoke the fiber: </p>
|
||||
<div class="codehilite"><pre><span></span>var fiber = Fiber.new {
|
||||
Fiber.yield("Reply")
|
||||
}
|
||||
<div class="codehilite"><pre><span class="k">var</span> <span class="n">fiber</span> <span class="o">=</span> <span class="vg">Fiber</span><span class="o">.</span><span class="n">new</span> <span class="p">{</span>
|
||||
<span class="vg">Fiber</span><span class="o">.</span><span class="n">yield</span><span class="p">(</span><span class="s">"Reply"</span><span class="p">)</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
System.print(fiber.call()) //> Reply
|
||||
<span class="vg">System</span><span class="o">.</span><span class="n">print</span><span class="p">(</span><span class="n">fiber</span><span class="o">.</span><span class="n">call</span><span class="p">())</span> <span class="output">Reply</span>
|
||||
</pre></div>
|
||||
|
||||
|
||||
@ -221,11 +221,11 @@ you can iterate over. </p>
|
||||
you use to create a fiber can call a method that calls another method that calls
|
||||
some third method which finally calls yield. When that happens, <em>all</em> of those
|
||||
method calls — the entire callstack — gets suspended. For example: </p>
|
||||
<div class="codehilite"><pre><span></span>var fiber = Fiber.new {
|
||||
(1..10).each {|i|
|
||||
Fiber.yield(i)
|
||||
}
|
||||
}
|
||||
<div class="codehilite"><pre><span class="k">var</span> <span class="n">fiber</span> <span class="o">=</span> <span class="vg">Fiber</span><span class="o">.</span><span class="n">new</span> <span class="p">{</span>
|
||||
<span class="p">(</span><span class="mi">1</span><span class="o">..</span><span class="mi">10</span><span class="p">)</span><span class="o">.</span><span class="n">each</span> <span class="p">{</span><span class="o">|</span><span class="err">i</span><span class="o">|</span>
|
||||
<span class="vg">Fiber</span><span class="o">.</span><span class="n">yield</span><span class="p">(</span><span class="err">i</span><span class="p">)</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
</pre></div>
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user