368 lines
34 KiB
HTML
368 lines
34 KiB
HTML
|
<!DOCTYPE HTML>
|
|||
|
<html lang="en" class="sidebar-visible no-js light">
|
|||
|
<head>
|
|||
|
<!-- Book generated using mdBook -->
|
|||
|
<meta charset="UTF-8">
|
|||
|
<title>Hello, World! - The Rust Programming Language</title>
|
|||
|
|
|||
|
|
|||
|
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
|
|||
|
<meta name="description" content="">
|
|||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|||
|
<meta name="theme-color" content="#ffffff" />
|
|||
|
|
|||
|
<link rel="shortcut icon" href="favicon.png">
|
|||
|
<link rel="stylesheet" href="css/variables.css">
|
|||
|
<link rel="stylesheet" href="css/general.css">
|
|||
|
<link rel="stylesheet" href="css/chrome.css">
|
|||
|
<link rel="stylesheet" href="css/print.css" media="print">
|
|||
|
|
|||
|
<!-- Fonts -->
|
|||
|
<link rel="stylesheet" href="FontAwesome/css/font-awesome.css">
|
|||
|
<link href="googleFonts/css.css" rel="stylesheet" type="text/css">
|
|||
|
|
|||
|
<!-- Highlight.js Stylesheets -->
|
|||
|
<link rel="stylesheet" href="highlight.css">
|
|||
|
<link rel="stylesheet" href="tomorrow-night.css">
|
|||
|
<link rel="stylesheet" href="ayu-highlight.css">
|
|||
|
|
|||
|
<!-- Custom theme stylesheets -->
|
|||
|
|
|||
|
<link rel="stylesheet" href="ferris.css">
|
|||
|
|
|||
|
<link rel="stylesheet" href="theme/2018-edition.css">
|
|||
|
|
|||
|
|
|||
|
|
|||
|
</head>
|
|||
|
<body>
|
|||
|
<!-- Provide site root to javascript -->
|
|||
|
<script type="text/javascript">
|
|||
|
var path_to_root = "";
|
|||
|
var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "light" : "light";
|
|||
|
</script>
|
|||
|
|
|||
|
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
|||
|
<script type="text/javascript">
|
|||
|
try {
|
|||
|
var theme = localStorage.getItem('mdbook-theme');
|
|||
|
var sidebar = localStorage.getItem('mdbook-sidebar');
|
|||
|
|
|||
|
if (theme.startsWith('"') && theme.endsWith('"')) {
|
|||
|
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
|||
|
}
|
|||
|
|
|||
|
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
|||
|
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
|||
|
}
|
|||
|
} catch (e) { }
|
|||
|
</script>
|
|||
|
|
|||
|
<!-- Set the theme before any content is loaded, prevents flash -->
|
|||
|
<script type="text/javascript">
|
|||
|
var theme;
|
|||
|
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
|||
|
if (theme === null || theme === undefined) { theme = default_theme; }
|
|||
|
var html = document.querySelector('html');
|
|||
|
html.classList.remove('no-js')
|
|||
|
html.classList.remove('light')
|
|||
|
html.classList.add(theme);
|
|||
|
html.classList.add('js');
|
|||
|
</script>
|
|||
|
|
|||
|
<!-- Hide / unhide sidebar before it is displayed -->
|
|||
|
<script type="text/javascript">
|
|||
|
var html = document.querySelector('html');
|
|||
|
var sidebar = 'hidden';
|
|||
|
if (document.body.clientWidth >= 1080) {
|
|||
|
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
|||
|
sidebar = sidebar || 'visible';
|
|||
|
}
|
|||
|
html.classList.remove('sidebar-visible');
|
|||
|
html.classList.add("sidebar-" + sidebar);
|
|||
|
</script>
|
|||
|
|
|||
|
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
|
|||
|
<div id="sidebar-scrollbox" class="sidebar-scrollbox">
|
|||
|
<ol class="chapter"><li class="expanded affix "><a href="title-page.html">The Rust Programming Language</a></li><li class="expanded affix "><a href="foreword.html">Foreword</a></li><li class="expanded affix "><a href="ch00-00-introduction.html">Introduction</a></li><li class="expanded "><a href="ch01-00-getting-started.html"><strong aria-hidden="true">1.</strong> Getting Started</a></li><li><ol class="section"><li class="expanded "><a href="ch01-01-installation.html"><strong aria-hidden="true">1.1.</strong> Installation</a></li><li class="expanded "><a href="ch01-02-hello-world.html" class="active"><strong aria-hidden="true">1.2.</strong> Hello, World!</a></li><li class="expanded "><a href="ch01-03-hello-cargo.html"><strong aria-hidden="true">1.3.</strong> Hello, Cargo!</a></li></ol></li><li class="expanded "><a href="ch02-00-guessing-game-tutorial.html"><strong aria-hidden="true">2.</strong> Programming a Guessing Game</a></li><li class="expanded "><a href="ch03-00-common-programming-concepts.html"><strong aria-hidden="true">3.</strong> Common Programming Concepts</a></li><li><ol class="section"><li class="expanded "><a href="ch03-01-variables-and-mutability.html"><strong aria-hidden="true">3.1.</strong> Variables and Mutability</a></li><li class="expanded "><a href="ch03-02-data-types.html"><strong aria-hidden="true">3.2.</strong> Data Types</a></li><li class="expanded "><a href="ch03-03-how-functions-work.html"><strong aria-hidden="true">3.3.</strong> Functions</a></li><li class="expanded "><a href="ch03-04-comments.html"><strong aria-hidden="true">3.4.</strong> Comments</a></li><li class="expanded "><a href="ch03-05-control-flow.html"><strong aria-hidden="true">3.5.</strong> Control Flow</a></li></ol></li><li class="expanded "><a href="ch04-00-understanding-ownership.html"><strong aria-hidden="true">4.</strong> Understanding Ownership</a></li><li><ol class="section"><li class="expanded "><a href="ch04-01-what-is-ownership.html"><strong aria-hidden="true">4.1.</strong> What is Ownership?</a></li><li class="expanded "><a href="ch04-02-references-and-borrowing.html"><strong aria-hidden="true">4.2.</strong> References and Borrowing</a></li><li class="expanded "><a href="ch04-03-slices.html"><strong aria-hidden="true">4.3.</strong> The Slice Type</a></li></ol></li><li class="expanded "><a href="ch05-00-structs.html"><strong aria-hidden="true">5.</strong> Using Structs to Structure Related Data</a></li><li><ol class="section"><li class="expanded "><a href="ch05-01-defining-structs.html"><strong aria-hidden="true">5.1.</strong> Defining and Instantiating Structs</a></li><li class="expanded "><a href="ch05-02-example-structs.html"><strong aria-hidden="true">5.2.</strong> An Example Program Using Structs</a></li><li class="expanded "><a href="ch05-03-method-syntax.html"><strong aria-hidden="true">5.3.</strong> Method Syntax</a></li></ol></li><li class="expanded "><a href="ch06-00-enums.html"><strong aria-hidden="true">6.</strong> Enums and Pattern Matching</a></li><li><ol class="section"><li class="expanded "><a href="ch06-01-defining-an-enum.html"><strong aria-hidden="true">6.1.</strong> Defining an Enum</a></li><li class="expanded "><a href="ch06-02-match.html"><strong aria-hidden="true">6.2.</strong> The match Control Flow Operator</a></li><li class="expanded "><a href="ch06-03-if-let.html"><strong aria-hidden="true">6.3.</strong> Concise Control Flow with if let</a></li></ol></li><li class="expanded "><a href="ch07-00-managing-growing-projects-with-packages-crates-and-modules.html"><strong aria-hidden="true">7.</strong> Managing Growing Projects with Packages, Crates, and Modules</a></li><li><ol class="section"><li class="expanded "><a href="ch07-01-packages-and-crates.html"><strong aria-hidden="true">7.1.</strong> Packages and Crates</a></li><li class="expanded "><a href="ch07-02-defining-modules-to-control-scope-and-privacy.html"><strong aria-hidden="true">7.2.</strong> Defining Modules to Control Scope and Privacy</a></li><li class="expanded "><a href="ch07-03-paths-for-referring-to-an-item-in-the-modu
|
|||
|
</div>
|
|||
|
<div id="sidebar-resize-handle" class="sidebar-resize-handle"></div>
|
|||
|
</nav>
|
|||
|
|
|||
|
<div id="page-wrapper" class="page-wrapper">
|
|||
|
|
|||
|
<div class="page">
|
|||
|
|
|||
|
<div id="menu-bar" class="menu-bar">
|
|||
|
<div id="menu-bar-sticky-container">
|
|||
|
<div class="left-buttons">
|
|||
|
<button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
|
|||
|
<i class="fa fa-bars"></i>
|
|||
|
</button>
|
|||
|
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
|
|||
|
<i class="fa fa-paint-brush"></i>
|
|||
|
</button>
|
|||
|
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
|||
|
<li role="none"><button role="menuitem" class="theme" id="light">Light (default)</button></li>
|
|||
|
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
|
|||
|
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
|
|||
|
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
|
|||
|
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
|
|||
|
</ul>
|
|||
|
|
|||
|
<button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
|
|||
|
<i class="fa fa-search"></i>
|
|||
|
</button>
|
|||
|
|
|||
|
</div>
|
|||
|
|
|||
|
<h1 class="menu-title">The Rust Programming Language</h1>
|
|||
|
|
|||
|
<div class="right-buttons">
|
|||
|
<a href="print.html" title="Print this book" aria-label="Print this book">
|
|||
|
<i id="print-button" class="fa fa-print"></i>
|
|||
|
</a>
|
|||
|
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
|
|||
|
|
|||
|
<div id="search-wrapper" class="hidden">
|
|||
|
<form id="searchbar-outer" class="searchbar-outer">
|
|||
|
<input type="search" name="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
|
|||
|
</form>
|
|||
|
<div id="searchresults-outer" class="searchresults-outer hidden">
|
|||
|
<div id="searchresults-header" class="searchresults-header"></div>
|
|||
|
<ul id="searchresults">
|
|||
|
</ul>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
|
|||
|
|
|||
|
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
|||
|
<script type="text/javascript">
|
|||
|
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
|||
|
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
|||
|
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
|
|||
|
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
|||
|
});
|
|||
|
</script>
|
|||
|
|
|||
|
<div id="content" class="content">
|
|||
|
<main>
|
|||
|
<h2><a class="header" href="#hello-world" id="hello-world">Hello, World!</a></h2>
|
|||
|
<p>Now that you’ve installed Rust, let’s write your first Rust program. It’s
|
|||
|
traditional when learning a new language to write a little program that prints
|
|||
|
the text <code>Hello, world!</code> to the screen, so we’ll do the same here!</p>
|
|||
|
<blockquote>
|
|||
|
<p>Note: This book assumes basic familiarity with the command line. Rust makes
|
|||
|
no specific demands about your editing or tooling or where your code lives, so
|
|||
|
if you prefer to use an integrated development environment (IDE) instead of
|
|||
|
the command line, feel free to use your favorite IDE. Many IDEs now have some
|
|||
|
degree of Rust support; check the IDE’s documentation for details. Recently,
|
|||
|
the Rust team has been focusing on enabling great IDE support, and progress
|
|||
|
has been made rapidly on that front!</p>
|
|||
|
</blockquote>
|
|||
|
<h3><a class="header" href="#creating-a-project-directory" id="creating-a-project-directory">Creating a Project Directory</a></h3>
|
|||
|
<p>You’ll start by making a directory to store your Rust code. It doesn’t matter
|
|||
|
to Rust where your code lives, but for the exercises and projects in this book,
|
|||
|
we suggest making a <em>projects</em> directory in your home directory and keeping all
|
|||
|
your projects there.</p>
|
|||
|
<p>Open a terminal and enter the following commands to make a <em>projects</em> directory
|
|||
|
and a directory for the “Hello, world!” project within the <em>projects</em> directory.</p>
|
|||
|
<p>For Linux, macOS, and PowerShell on Windows, enter this:</p>
|
|||
|
<pre><code class="language-text">$ mkdir ~/projects
|
|||
|
$ cd ~/projects
|
|||
|
$ mkdir hello_world
|
|||
|
$ cd hello_world
|
|||
|
</code></pre>
|
|||
|
<p>For Windows CMD, enter this:</p>
|
|||
|
<pre><code class="language-cmd">> mkdir "%USERPROFILE%\projects"
|
|||
|
> cd /d "%USERPROFILE%\projects"
|
|||
|
> mkdir hello_world
|
|||
|
> cd hello_world
|
|||
|
</code></pre>
|
|||
|
<h3><a class="header" href="#writing-and-running-a-rust-program" id="writing-and-running-a-rust-program">Writing and Running a Rust Program</a></h3>
|
|||
|
<p>Next, make a new source file and call it <em>main.rs</em>. Rust files always end with
|
|||
|
the <em>.rs</em> extension. If you’re using more than one word in your filename, use
|
|||
|
an underscore to separate them. For example, use <em>hello_world.rs</em> rather than
|
|||
|
<em>helloworld.rs</em>.</p>
|
|||
|
<p>Now open the <em>main.rs</em> file you just created and enter the code in Listing 1-1.</p>
|
|||
|
<p><span class="filename">Filename: main.rs</span></p>
|
|||
|
<pre><pre class="playpen"><code class="language-rust">fn main() {
|
|||
|
println!("Hello, world!");
|
|||
|
}
|
|||
|
</code></pre></pre>
|
|||
|
<p><span class="caption">Listing 1-1: A program that prints <code>Hello, world!</code></span></p>
|
|||
|
<p>Save the file and go back to your terminal window. On Linux or macOS, enter
|
|||
|
the following commands to compile and run the file:</p>
|
|||
|
<pre><code class="language-text">$ rustc main.rs
|
|||
|
$ ./main
|
|||
|
Hello, world!
|
|||
|
</code></pre>
|
|||
|
<p>On Windows, enter the command <code>.\main.exe</code> instead of <code>./main</code>:</p>
|
|||
|
<pre><code class="language-powershell">> rustc main.rs
|
|||
|
> .\main.exe
|
|||
|
Hello, world!
|
|||
|
</code></pre>
|
|||
|
<p>Regardless of your operating system, the string <code>Hello, world!</code> should print to
|
|||
|
the terminal. If you don’t see this output, refer back to the
|
|||
|
<a href="ch01-01-installation.html#troubleshooting">“Troubleshooting”</a><!-- ignore --> part of the Installation
|
|||
|
section for ways to get help.</p>
|
|||
|
<p>If <code>Hello, world!</code> did print, congratulations! You’ve officially written a Rust
|
|||
|
program. That makes you a Rust programmer—welcome!</p>
|
|||
|
<h3><a class="header" href="#anatomy-of-a-rust-program" id="anatomy-of-a-rust-program">Anatomy of a Rust Program</a></h3>
|
|||
|
<p>Let’s review in detail what just happened in your “Hello, world!” program.
|
|||
|
Here’s the first piece of the puzzle:</p>
|
|||
|
<pre><pre class="playpen"><code class="language-rust">fn main() {
|
|||
|
|
|||
|
}
|
|||
|
</code></pre></pre>
|
|||
|
<p>These lines define a function in Rust. The <code>main</code> function is special: it is
|
|||
|
always the first code that runs in every executable Rust program. The first
|
|||
|
line declares a function named <code>main</code> that has no parameters and returns
|
|||
|
nothing. If there were parameters, they would go inside the parentheses, <code>()</code>.</p>
|
|||
|
<p>Also, note that the function body is wrapped in curly brackets, <code>{}</code>. Rust
|
|||
|
requires these around all function bodies. It’s good style to place the opening
|
|||
|
curly bracket on the same line as the function declaration, adding one space in
|
|||
|
between.</p>
|
|||
|
<p>At the time of this writing, an automatic formatter tool called <code>rustfmt</code> is
|
|||
|
under development. If you want to stick to a standard style across Rust
|
|||
|
projects, <code>rustfmt</code> will format your code in a particular style. The Rust team
|
|||
|
plans to eventually include this tool with the standard Rust distribution, like
|
|||
|
<code>rustc</code>. So depending on when you read this book, it might already be installed
|
|||
|
on your computer! Check the online documentation for more details.</p>
|
|||
|
<p>Inside the <code>main</code> function is the following code:</p>
|
|||
|
<pre><pre class="playpen"><code class="language-rust">
|
|||
|
<span class="boring">#![allow(unused_variables)]
|
|||
|
</span><span class="boring">fn main() {
|
|||
|
</span> println!("Hello, world!");
|
|||
|
<span class="boring">}
|
|||
|
</span></code></pre></pre>
|
|||
|
<p>This line does all the work in this little program: it prints text to the
|
|||
|
screen. There are four important details to notice here. First, Rust style is
|
|||
|
to indent with four spaces, not a tab.</p>
|
|||
|
<p>Second, <code>println!</code> calls a Rust macro. If it called a function instead, it
|
|||
|
would be entered as <code>println</code> (without the <code>!</code>). We’ll discuss Rust macros in
|
|||
|
more detail in Chapter 19. For now, you just need to know that using a <code>!</code>
|
|||
|
means that you’re calling a macro instead of a normal function.</p>
|
|||
|
<p>Third, you see the <code>"Hello, world!"</code> string. We pass this string as an argument
|
|||
|
to <code>println!</code>, and the string is printed to the screen.</p>
|
|||
|
<p>Fourth, we end the line with a semicolon (<code>;</code>), which indicates that this
|
|||
|
expression is over and the next one is ready to begin. Most lines of Rust code
|
|||
|
end with a semicolon.</p>
|
|||
|
<h3><a class="header" href="#compiling-and-running-are-separate-steps" id="compiling-and-running-are-separate-steps">Compiling and Running Are Separate Steps</a></h3>
|
|||
|
<p>You’ve just run a newly created program, so let’s examine each step in the
|
|||
|
process.</p>
|
|||
|
<p>Before running a Rust program, you must compile it using the Rust compiler by
|
|||
|
entering the <code>rustc</code> command and passing it the name of your source file, like
|
|||
|
this:</p>
|
|||
|
<pre><code class="language-text">$ rustc main.rs
|
|||
|
</code></pre>
|
|||
|
<p>If you have a C or C++ background, you’ll notice that this is similar to <code>gcc</code>
|
|||
|
or <code>clang</code>. After compiling successfully, Rust outputs a binary executable.</p>
|
|||
|
<p>On Linux, macOS, and PowerShell on Windows, you can see the executable by
|
|||
|
entering the <code>ls</code> command in your shell. On Linux and macOS, you’ll see two
|
|||
|
files. With PowerShell on Windows, you’ll see the same three files that you
|
|||
|
would see using CMD.</p>
|
|||
|
<pre><code class="language-text">$ ls
|
|||
|
main main.rs
|
|||
|
</code></pre>
|
|||
|
<p>With CMD on Windows, you would enter the following:</p>
|
|||
|
<pre><code class="language-cmd">> dir /B %= the /B option says to only show the file names =%
|
|||
|
main.exe
|
|||
|
main.pdb
|
|||
|
main.rs
|
|||
|
</code></pre>
|
|||
|
<p>This shows the source code file with the <em>.rs</em> extension, the executable file
|
|||
|
(<em>main.exe</em> on Windows, but <em>main</em> on all other platforms), and, when using
|
|||
|
Windows, a file containing debugging information with the <em>.pdb</em> extension.
|
|||
|
From here, you run the <em>main</em> or <em>main.exe</em> file, like this:</p>
|
|||
|
<pre><code class="language-text">$ ./main # or .\main.exe on Windows
|
|||
|
</code></pre>
|
|||
|
<p>If <em>main.rs</em> was your “Hello, world!” program, this line would print <code>Hello, world!</code> to your terminal.</p>
|
|||
|
<p>If you’re more familiar with a dynamic language, such as Ruby, Python, or
|
|||
|
JavaScript, you might not be used to compiling and running a program as
|
|||
|
separate steps. Rust is an <em>ahead-of-time compiled</em> language, meaning you can
|
|||
|
compile a program and give the executable to someone else, and they can run it
|
|||
|
even without having Rust installed. If you give someone a <em>.rb</em>, <em>.py</em>, or
|
|||
|
<em>.js</em> file, they need to have a Ruby, Python, or JavaScript implementation
|
|||
|
installed (respectively). But in those languages, you only need one command to
|
|||
|
compile and run your program. Everything is a trade-off in language design.</p>
|
|||
|
<p>Just compiling with <code>rustc</code> is fine for simple programs, but as your project
|
|||
|
grows, you’ll want to manage all the options and make it easy to share your
|
|||
|
code. Next, we’ll introduce you to the Cargo tool, which will help you write
|
|||
|
real-world Rust programs.</p>
|
|||
|
|
|||
|
</main>
|
|||
|
|
|||
|
<nav class="nav-wrapper" aria-label="Page navigation">
|
|||
|
<!-- Mobile navigation buttons -->
|
|||
|
|
|||
|
<a rel="prev" href="ch01-01-installation.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
|||
|
<i class="fa fa-angle-left"></i>
|
|||
|
</a>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<a rel="next" href="ch01-03-hello-cargo.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
|||
|
<i class="fa fa-angle-right"></i>
|
|||
|
</a>
|
|||
|
|
|||
|
|
|||
|
<div style="clear: both"></div>
|
|||
|
</nav>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
|
|||
|
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
|||
|
|
|||
|
<a href="ch01-01-installation.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
|||
|
<i class="fa fa-angle-left"></i>
|
|||
|
</a>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<a href="ch01-03-hello-cargo.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
|||
|
<i class="fa fa-angle-right"></i>
|
|||
|
</a>
|
|||
|
|
|||
|
</nav>
|
|||
|
|
|||
|
</div>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<script type="text/javascript">
|
|||
|
window.playpen_copyable = true;
|
|||
|
</script>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<script src="elasticlunr.min.js" type="text/javascript" charset="utf-8"></script>
|
|||
|
<script src="mark.min.js" type="text/javascript" charset="utf-8"></script>
|
|||
|
<script src="searcher.js" type="text/javascript" charset="utf-8"></script>
|
|||
|
|
|||
|
|
|||
|
<script src="clipboard.min.js" type="text/javascript" charset="utf-8"></script>
|
|||
|
<script src="highlight.js" type="text/javascript" charset="utf-8"></script>
|
|||
|
<script src="book.js" type="text/javascript" charset="utf-8"></script>
|
|||
|
|
|||
|
<!-- Custom JS scripts -->
|
|||
|
|
|||
|
<script type="text/javascript" src="ferris.js"></script>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
</body>
|
|||
|
</html>
|