You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
226 lines
8.9 KiB
226 lines
8.9 KiB
<!DOCTYPE html> |
|
<html lang="en"> |
|
<head> |
|
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
|
<meta http-equiv="content-type" content="text/html; charset=utf-8"> |
|
|
|
<!-- Enable responsiveness on mobile devices--> |
|
<!-- viewport-fit=cover is to support iPhone X rounded corners and notch in landscape--> |
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, viewport-fit=cover"> |
|
|
|
<title>Julio Biason .Me 4.3</title> |
|
|
|
<!-- CSS --> |
|
<link rel="stylesheet" href="https://blog.juliobiason.me/print.css" media="print"> |
|
<link rel="stylesheet" href="https://blog.juliobiason.me/poole.css"> |
|
<link rel="stylesheet" href="https://blog.juliobiason.me/hyde.css"> |
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=PT+Sans:400,400italic,700|Abril+Fatface"> |
|
|
|
|
|
|
|
|
|
|
|
</head> |
|
|
|
<body class=" "> |
|
|
|
<div class="sidebar"> |
|
<div class="container sidebar-sticky"> |
|
<div class="sidebar-about"> |
|
|
|
<a href="https://blog.juliobiason.me"><h1>Julio Biason .Me 4.3</h1></a> |
|
|
|
<p class="lead">Old school dev living in a 2.0 dev world</p> |
|
|
|
|
|
</div> |
|
|
|
<ul class="sidebar-nav"> |
|
|
|
|
|
<li class="sidebar-nav-item"><a href="/">English</a></li> |
|
|
|
<li class="sidebar-nav-item"><a href="/pt">Português</a></li> |
|
|
|
<li class="sidebar-nav-item"><a href="/tags">Tags (EN)</a></li> |
|
|
|
<li class="sidebar-nav-item"><a href="/pt/tags">Tags (PT)</a></li> |
|
|
|
|
|
</ul> |
|
</div> |
|
</div> |
|
|
|
|
|
<div class="content container"> |
|
|
|
<div class="post"> |
|
<h1 class="post-title"> Learn you some Erlang for great good! - Fred Hebert</h1> |
|
<span class="post-date"> |
|
2020-10-25 |
|
|
|
<a href="https://blog.juliobiason.me/tags/books/">#books</a> |
|
|
|
<a href="https://blog.juliobiason.me/tags/reviews/">#reviews</a> |
|
|
|
<a href="https://blog.juliobiason.me/tags/it/">#it</a> |
|
|
|
<a href="https://blog.juliobiason.me/tags/erlang/">#erlang</a> |
|
|
|
<a href="https://blog.juliobiason.me/tags/fred-hebert/">#fred hebert</a> |
|
|
|
<a href="https://blog.juliobiason.me/tags/stars-4/">#stars:4</a> |
|
|
|
<a href="https://blog.juliobiason.me/tags/books-2020/">#books:2020</a> |
|
|
|
<a href="https://blog.juliobiason.me/tags/published-2012/">#published:2012</a> |
|
|
|
</span> |
|
<p><a href="https://www.goodreads.com/book/show/6718693-learn-you-some-erlang-for-great-good">GoodReads Summary</a>: |
|
(No Summary)</p> |
|
<span id="continue-reading"></span><div> |
|
★★★★☆ |
|
</div> |
|
<p>Another Erlang book for my collection.</p> |
|
<p>This one takes its time to explain every point. So if you like to go fast and |
|
furious, that's not it. Also, because I read some other books (ok, "book") |
|
about Erlang, some topics felt a little bit boring, 'cause I did get the point |
|
already.</p> |
|
<p>Also, it seems this books also suffer from the "let me use the shell to explain |
|
this point". It's not that bad when you want to show a point in the very |
|
beginning and then just drop it ('cause, you know, you won't use the shell as |
|
part of your application -- you may use as a helper to figure out when things |
|
go haywire, but not as a default tool) but not when you're near the middle of |
|
the book explaining some important topic, like supervisors.</p> |
|
<p>But, at the same time, some topics that the other books (ok, "book") completely |
|
ignored, like "how do you build, package and deploy an Erlang application".</p> |
|
<p>But yeah, the "using shell for important stuff" <em>really</em> annoyed me.</p> |
|
<h2 id="highlights">Highlights</h2> |
|
<blockquote> |
|
<p>The correct ordering of each element in a comparison is the following: |
|
number < atom < reference < fun < port < pid < tuple < list < bit string.</p> |
|
</blockquote> |
|
<blockquote> |
|
<p>A tuple that contains an atom with one element following it is called a |
|
tagged tuple.</p> |
|
</blockquote> |
|
<p><em>Note</em>: Example: <code>(tag, value, value)</code>, <code>(other_tag, value, value)</code>.</p> |
|
<blockquote> |
|
<p>port Erlang to the JVM, giving the Erjang.</p> |
|
</blockquote> |
|
<blockquote> |
|
<p>To compile to native code, you need to use the hipe module and call it the |
|
following way: hipe:c(Module,OptionsList). You could also use |
|
c(Module,[native]) </p> |
|
</blockquote> |
|
<blockquote> |
|
<p>There are also a few predefined macros, such as the following: </p> |
|
<ul> |
|
<li>?MODULE, which is replaced by the current module name as an atom </li> |
|
<li>?FILE, which is replaced by the filename as a string </li> |
|
<li>?LINE, which returns the line number of wherever the macro is placed </li> |
|
</ul> |
|
</blockquote> |
|
<blockquote> |
|
<p>-ifdef(DEBUGMODE).<br> |
|
-define(DEBUG(S), io:format("dbg: "++S)).<br> |
|
-else.<br> |
|
-define(DEBUG(S), ok).<br> |
|
-endif.</p> |
|
</blockquote> |
|
<p><em>Note</em>: This is how you define a function that exists only if the atom is |
|
defined.</p> |
|
<blockquote> |
|
<p>right_age(X) when X >= 16, X =< 104 -> true; |
|
right_age(_) -> false. </p> |
|
</blockquote> |
|
<p><em>Note</em>: The function for <code>right_age</code> returns true only when the guardian |
|
matches. Basically, we don't need <code>if</code>s in this kind of function.</p> |
|
<blockquote> |
|
<p>wrong_age(X) when X < 16; X > 104 -> true;<br> |
|
wrong_age(_) -> false </p> |
|
</blockquote> |
|
<p><em>Note</em>: Same thing.</p> |
|
<blockquote> |
|
<p>1> {ok, Binary} = file:read_file("road.txt").<br> |
|
{ok,<<"50\r\n10\r\n30\r\n5\r\n90\r\n20\r\n40\r\n2\r\n25\r\n10\r\n8\r\n0\r\n">>} <br> |
|
2> S = string:tokens(binary_to_list(Binary), "\r\n\t ").<br> |
|
["50","10","30","5","90","20","40","2","25","10","8","0"] </p> |
|
</blockquote> |
|
<p><em>Note</em>: the <code><<>></code> format denotes binary content (like bytes in Python, maybe?).</p> |
|
<blockquote> |
|
<p>main([FileName]) -> <br> |
|
{ok, Bin} = file:read_file(FileName),<br> |
|
Map = parse_map(Bin),<br> |
|
io:format("˜p˜n",[optimal_path(Map)]),<br> |
|
erlang:halt().</p> |
|
<p>The main function now has an arity of 1, needed to receive parameters from |
|
the command line. We’ve also added the function erlang:halt/0, which will |
|
shut down the Erlang VM after being called </p> |
|
</blockquote> |
|
<blockquote> |
|
<p>erlc road.erl <br> |
|
$ erl -noshell -run road main road.txt </p> |
|
</blockquote> |
|
<p><em>Note</em>: <code>erlc</code>, the Erlang Compiler. Still needs <code>erl</code> to run the thing, |
|
though.</p> |
|
<blockquote> |
|
<p>The Erlang escript command provides a simple way to run Erlang programs |
|
without starting the erl application directly.</p> |
|
</blockquote> |
|
<blockquote> |
|
<p>% This is a .hrl (header) file.<br> |
|
-record(included, {some_field, some_default = "yeah!", unimaginative_name}).</p> |
|
</blockquote> |
|
<p><em>Note</em>: Records are just tuples with added syntactic sugar.</p> |
|
<blockquote> |
|
<p>Because a single list doesn't allow efficiently adding and removing elements |
|
from both ends at once (it's only fast to add and remove the head), the idea |
|
behind the queue module is that if you have two lists, then you can use one |
|
to add elements and one to remove elements. One of the lists then behaves as |
|
one end of the queue, where you push values, and the other list acts as the |
|
other end, where you pop them. When the latter is empty, you take the former |
|
and reverse it </p> |
|
</blockquote> |
|
<blockquote> |
|
<p>Erlang directory structure, which looks like this:</p> |
|
<ul> |
|
<li>ebin/ </li> |
|
<li>include/ </li> |
|
<li>priv/ </li> |
|
<li>src/ </li> |
|
</ul> |
|
</blockquote> |
|
<blockquote> |
|
<p>Open a file named Emakefile.</p> |
|
</blockquote> |
|
<p><em>Note</em>: <code>Emakefile</code>s make file file.</p> |
|
<blockquote> |
|
<p>{'src/*', [debug_info, {i, "src"}, {i, "include"}, {outdir, "ebin"}]}. </p> |
|
</blockquote> |
|
<p><em>Note</em>: format of said Emakefile.</p> |
|
<blockquote> |
|
<p>erl -make </p> |
|
</blockquote> |
|
<p><em>Note</em>: How to build a project using the Emakefile.</p> |
|
<blockquote> |
|
<p>Start a shell to be a TCP server: </p> |
|
</blockquote> |
|
<p><em>Note</em>: This is the kind of stuff that drove me crazy: Why would I turn my |
|
shell into a TCP server? It makes no sense! Sure, it is simpler, but who the |
|
heck would do that in a normal way?</p> |
|
<blockquote> |
|
<p>Promises and futures are a bit like remote procedure calls </p> |
|
</blockquote> |
|
<p><em>Note</em>: WHAAAATTTTT?!?!?</p> |
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
</div> |
|
|
|
</body> |
|
|
|
</html>
|
|
|