344 lines
7.7 KiB
Plaintext
344 lines
7.7 KiB
Plaintext
---
|
||
engine: julia
|
||
julia:
|
||
exeflags: ["--color=yes"]
|
||
---
|
||
|
||
```{julia}
|
||
#| error: false
|
||
#| echo: false
|
||
#| output: false
|
||
using InteractiveUtils
|
||
```
|
||
|
||
# First Contact
|
||
|
||
This chapter helps you get started. It omits many details, and the code examples are often not optimal.
|
||
|
||
|
||
## Julia as a Calculator
|
||
|
||
```{julia}
|
||
#| eval: true
|
||
#| echo: false
|
||
#| output: false
|
||
|
||
using REPL, Markdown
|
||
|
||
function mhelp(s,n,m)
|
||
helptxt = Core.eval(Main, REPL.helpmode(s))
|
||
helpstr=Markdown.plaininline(helptxt)
|
||
print("...\n", join(split(helpstr,'\n')[n:m],'\n'), "\n...")
|
||
end;
|
||
|
||
function Tab(s)
|
||
dc = map(x->x.name, REPL.doc_completions(s))
|
||
l = filter(x->startswith(x,s), dc)
|
||
println.(l)
|
||
return # return nothing, since broadcasting println produces an empty vector
|
||
end
|
||
|
||
▷ = |>
|
||
|
||
# IJulia.set_verbose(true)
|
||
```
|
||
|
||
Compute the following: $\qquad 12^{1/3} + \frac{3\sqrt{2}}{\sin(0.5)-\cos(\frac{\pi}{4})\log(3)}+ e^5$
|
||
|
||
```{julia}
|
||
12^(1/3) + 3sqrt(2) / (sin(.5) - cos(pi/4)*log(3)) + exp(5)
|
||
```
|
||
|
||
Note that:
|
||
|
||
- Powers are written as `a^b`.
|
||
- The constant `π` is predefined.
|
||
- `log()` is the natural logarithm.
|
||
- The multiplication operator `*` can be omitted after a number when followed by a variable, function, or opening parenthesis.
|
||
|
||
|
||
## The most important keys: `Tab` and `?` {#sec-tab}
|
||
|
||
When programming, press the Tab key as soon as you've typed 2–3 letters of a word. Potential completions are then displayed or completed if the completion is unique. This saves time and you learn a lot about Julia.
|
||
|
||
```{julia}
|
||
lo = "lo" #| hide_line
|
||
lo ▷ Tab
|
||
```
|
||
|
||
```{julia}
|
||
pri = "pri" #| hide_line
|
||
pri ▷ Tab
|
||
```
|
||
|
||
Julia's built-in help system `?name` provides comprehensive documentation for all functions and constructs. Here is a relatively brief example:
|
||
|
||
:::{.content-visible unless-format="typst"}
|
||
|
||
```{julia}
|
||
?for
|
||
```
|
||
:::
|
||
|
||
:::{.content-hidden unless-format="typst"}
|
||
|
||
::: {.cell }
|
||
```{.julia .cell-code}
|
||
?for
|
||
```
|
||
|
||
::: {.cell-output .cell-output-stdout}
|
||
```
|
||
search: for nor xor foldr floor Core sort
|
||
|
||
for
|
||
|
||
for loops repeatedly evaluate a block of statements while iterating over a sequence of values.
|
||
|
||
The iteration variable is always a new variable, even if a variable of the same name exists in the enclosing scope. Use outer to reuse an existing local variable for iteration.
|
||
|
||
Examples
|
||
========
|
||
|
||
julia> for i in [1, 4, 0]
|
||
println(i)
|
||
end
|
||
1
|
||
4
|
||
0
|
||
|
||
```
|
||
:::
|
||
:::
|
||
:::
|
||
|
||
|
||
## Variables and Assignments
|
||
|
||
Variables are created through assignment with the assignment operator `=`.
|
||
|
||
```{julia}
|
||
x = 1 + sqrt(5)
|
||
y = x / 2
|
||
```
|
||
|
||
In interactive mode, Julia displays the result of the last statement.
|
||
|
||
:::{.callout-note .titlenormal}
|
||
Assignments are not mathematical equations. The semantics of the assignment operator (the equals sign) is:
|
||
|
||
- Compute the right side and
|
||
- Assign the result to the left side.
|
||
|
||
Expressions like `x + y = sin(2)` are therefore invalid. Only a variable name may appear on the left side.
|
||
:::
|
||
|
||
|
||
## Data types
|
||
|
||
Julia is a [strongly typed](https://en.wikipedia.org/wiki/Strong_and_weak_typing) language
|
||
where every object has a type. Among the fundamental types are:
|
||
|
||
|
||
- Integers
|
||
- Floating-point numbers
|
||
- Strings
|
||
- Booleans.
|
||
|
||
The type of a variable can be determined using the `typeof()` function.
|
||
|
||
```{julia}
|
||
#| warning: true
|
||
#| error: true
|
||
for x ∈ (42, 12.0, 3.3e4, "Hello!", true)
|
||
println("x = ", x, " ... Type: ", typeof(x))
|
||
end
|
||
```
|
||
The standard floating-point number has a size of 64 bits, which corresponds to a `double` in C/C++/Java.
|
||
|
||
Julia is a [dynamically typed](https://en.wikipedia.org/wiki/Dynamic_typing) language.
|
||
Variables have no type; they are typeless references (pointers) to typed objects.
|
||
When people speak of the "type of a variable", they mean the type of the object currently assigned to the variable.
|
||
|
||
```{julia}
|
||
x = sqrt(2)
|
||
|
||
println( typeof(x), " - Value of x = $x" )
|
||
|
||
x = "Now I'm no longer a floating-point number!"
|
||
|
||
println( typeof(x), " - Value of x = $x" )
|
||
```
|
||
|
||
## Print statements
|
||
The `println()` function adds a line break at the end; `print()` does not.
|
||
```{julia}
|
||
print(y)
|
||
print("...the line continues...")
|
||
print("still...")
|
||
println(y)
|
||
println("New line")
|
||
println("New line")
|
||
```
|
||
|
||
Both functions can accept a list of string literals and variables as arguments. Variables can also be embedded in strings by prefixing the variable name with a dollar sign *(string interpolation)*.
|
||
|
||
```{julia}
|
||
x = 23
|
||
y = 3x + 5
|
||
zz = "Done!"
|
||
println("x= ", x, " ... and y= ", y, "...", zz) # 1. variant
|
||
println("x= $x ... and y= $y...$zz") # variant with string interpolation
|
||
```
|
||
|
||
|
||
:::{.callout-note .titlenormal collapse=true icon=false }
|
||
## If you want to print a dollar sign...
|
||
|
||
you must escape it with a *backslash*. To print a *backslash* itself, you must double it.
|
||
```{julia}
|
||
println("One dollar: 1\$ and three backslashes: \\\\\\ ")
|
||
```
|
||
:::
|
||
|
||
## Functions
|
||
Function definitions begin with the keyword `function` and end with the keyword `end`. Typically, they have one or more arguments and return a computed result via a `return` statement.
|
||
```{julia}
|
||
function hypotenuse(a, b) # a bit cumbersome
|
||
c2 = a^2 + b^2
|
||
c = sqrt(c2)
|
||
return c
|
||
end
|
||
```
|
||
After definition, the function can be used (called). The variables `a,b,c,c2` used in the definition are local and not available outside the function definition.
|
||
```{julia}
|
||
#| error: true
|
||
x = 3
|
||
z = hypotenuse(x, 4)
|
||
println("z = $z")
|
||
println("c = $c")
|
||
```
|
||
|
||
Very simple functions can also be defined as one-liners:
|
||
```{julia}
|
||
hypotenuse(a, b) = sqrt(a^2+b^2)
|
||
```
|
||
|
||
|
||
## Tests
|
||
Tests return a Boolean value (`true` or `false`).
|
||
```{julia}
|
||
x = 3^2
|
||
x < 2^3
|
||
```
|
||
In addition to the usual arithmetic comparisons `==, !=, <, <=, >, >=`
|
||
there are many other tests. The result of a test can also be assigned to a variable, which is then of type `Bool`. The logical operators `&&`, `||` and negation `!` can be used in tests.
|
||
|
||
```{julia}
|
||
test1 = "Car" in ["Bicycle", "Car", "Train"]
|
||
test2 = x == 100 || !(x <= 30 && x > 8)
|
||
test3 = startswith("lampshade", "Lamp")
|
||
println("$test1 $test2 $test3")
|
||
```
|
||
|
||
|
||
## Conditional Statements
|
||
|
||
A simple `if` statement has the form
|
||
```default
|
||
if <test>
|
||
<statement1>
|
||
<statement2>
|
||
...
|
||
end
|
||
```
|
||
|
||
There can be one or more `elseif` blocks and an optional final `else` block.
|
||
```{julia}
|
||
x = sqrt(100)
|
||
|
||
if x > 20
|
||
println("Strange!")
|
||
else
|
||
println("OK")
|
||
y = x + 3
|
||
end
|
||
```
|
||
|
||
Indentation enhances readability but is optional. Line breaks separate statements, as do semicolons. The code above is equivalent to the following single line in Julia:
|
||
```{julia}
|
||
# Please don't program like this! You will regret it!
|
||
x=sqrt(100); if x > 20 println("Strange!") else println("OK"); y = x + 3 end
|
||
```
|
||
|
||
|
||
|
||
## Simple `for` loops
|
||
|
||
`for` loops for repeating the execution of statements have the form
|
||
```default
|
||
for <counter> = start:end
|
||
<statement1>
|
||
<statement2>
|
||
...
|
||
end
|
||
```
|
||
Example:
|
||
|
||
```{julia}
|
||
sum = 0
|
||
for i = 1:100
|
||
sum = sum + i
|
||
end
|
||
sum
|
||
```
|
||
|
||
|
||
## Arrays
|
||
One-dimensional arrays (vectors) are a simple container type. They can be created with square brackets
|
||
and accessed by index, with indexing starting at 1.
|
||
|
||
```{julia}
|
||
v = [12, 33.2, 17, 19, 22]
|
||
```
|
||
|
||
```{julia}
|
||
typeof(v)
|
||
```
|
||
|
||
```{julia}
|
||
v[1] = v[4] + 10
|
||
v
|
||
```
|
||
|
||
Empty vectors can be created and extended with `push!()`.
|
||
```{julia}
|
||
v = [] # empty vector
|
||
push!(v, 42)
|
||
push!(v, 13)
|
||
v
|
||
```
|
||
|
||
|
||
:::{.callout-note icon="false" .titlenormal collapse="true" font-variant-ligatures="no-contextual" }
|
||
|
||
## Appendix: how the effect of the Tab key was simulated on this page
|
||
|
||
```{julia}
|
||
using REPL
|
||
function Tab(s)
|
||
dc = map(x->x.name, REPL.doc_completions(s))
|
||
l = filter(x->startswith(x,s), dc)
|
||
println.(l)
|
||
return # return nothing, since broadcast println produces empty vector
|
||
end
|
||
|
||
▷ = |> # https://docs.julialang.org/en/v1/manual/functions/#Function-composition-and-piping
|
||
|
||
pri = "pri";
|
||
```
|
||
|
||
```{julia}
|
||
pri ▷ Tab
|
||
```
|
||
::: |