Vamos a dar una breve introducción al lenguaje Julia
El comando para mostrar un resultado en pantalla es println()
, como se ve a continuación
println("Hello Julia!")
Hello Julia!
Los comentarios de una sola linea empiezan con #, mientras que los multilinea empiezan con #= y terminan con =#
println("Este si")
# println("Este no")
#=
println("Mucho menos")
println("estos dos")
=#
Este si
Existen tambien varios tipos de números, pasando por los enteros, punto flotante, complejos y racionales
# Int64
3
# Float64
3.2
# Complex{Int64}
2 + 1im
# Rational{Int64}
2//3
2//3
También como tal se pueden aplicar las diferentes operaciones entre números
1 + 1 # => 2
8 - 1 # => 7
10 * 2 # => 20
35 / 5 # => 7.0
5 / 2 # => 2.5
div(5, 2) # => 2
5 \ 35 # => 7.0
2 ^ 2 # => 4
12 % 10 # => 2
2
También se pueden aplicar las operaciones binarias o bitwise
~2 # => -3 # not
3 & 5 # => 1 # and
2 | 4 # => 6 # or
2 $ 4 # => 6 # xor
2 >>> 1 # => 1 # corrimeinto lógico a la derecha
2 >> 1 # => 1 # corrimeinto aritmético a la derecha
2 << 1 # => 4 # corrimeinto lógico/aritmético a la izquierda
4
Los valores booleanos son true y false, sin mayúscula inicial, y se presentan a continuación
!true # => false
!false # => true
1 == 1 # => true
2 == 1 # => false
1 != 1 # => false
2 != 1 # => true
1 < 10 # => true
1 > 10 # => false
2 <= 2 # => true
2 >= 2 # => true
true
Otra característica es que los comparadores se pueden poner encadenados
1 < 2 < 3 # => true
2 < 3 < 2 # => false
false
Las cadenas van entre comilla doble, los caracteres en comilla sencilla y se puede usar la interpolación de cadenas, a continuación se muestran dos maneras de poner valores en estas
@printf "%d is less than %f" 4.5 5.3 # => "5 is less than 5.300000"
"2 + 2 = $(2 + 2)" # => "2 + 2 = 4"
5 is less than
"2 + 2 = 4"
5.300000
Las variables no necesariamente deben ser tipadas, por lo que no deben instanciarse antes de asignarlas
some_var = 5
some_var
5
Lo cual no significa que acceder a una variable antes de asignarla no genere un error (de paso se muestra el manejo de errores)
try
some_other_var # => ERROR: some_other_var no definida
catch e
println(e)
end
UndefVarError(:some_other_var)
Para las listas hay que tener en cuenta que el indice va desde 1 hasta n
a = Int64[] # arreglo vacio
push!(a,1) # => [1]
push!(a,2) # => [1,2]
a[1]
1
La instanciación puede indicar el tipo o dejarlo de manera automática
b = [4, 5, 6] # => Int64 [4, 5, 6]
b = [4; 5; 6] # => Int64 [4, 5, 6]
b = Int8[4, 5, 6] # => Int8 [4, 5, 6]
b[1] # => 4
b[end] # => 6
6
El signo de exclamación ! al final de una función indica que esta modifica el estado de los parámetros
arr = [5,4,6]
sort(arr) # => [4,5,6]; arr es [5,4,6]
sort!(arr) # => [4,5,6]; arr es [4,5,6]
3-element Array{Int64,1}: 4 5 6
Los arreglos pueden ser creados a partir de rangos, y para acceder a estos puede igual hacerse por rangos (slice)
a = [1:5;] # => Int64 [1,2,3,4,5]
a[1:3] # => [1, 2, 3]
a[2:end] # => [2, 3, 4, 5]
4-element Array{Int64,1}: 2 3 4 5
Los métodos más comunes para listas son:
Las tuplas se comportan de manera similar a las listas, con la excepción de que son inmutables.
tupla = (1, 2, 3)
otra_tupla = 1, 2, 3
(1,2,3)
Para el uso de diccionarios, su instanciación puede ser vacía o con objetos
empty_dict = Dict() # instanciación vacía
filled_dict = Dict("one"=> 1, "two"=> 2, "three"=> 3) # instanciación con elementos
Dict{ASCIIString,Int64} with 3 entries: "two" => 2 "one" => 1 "three" => 3
Para acceder a las llaves y valores como listas de un diccionario
keys(filled_dict)
values(filled_dict)
Base.ValueIterator for a Dict{ASCIIString,Int64} with 3 entries. Values: 2 1 3
Se puede saber si una llave o una llave-valor hacen parte del diccionario
in(("one" => 1), filled_dict) # => true
in(("two" => 3), filled_dict) # => false
haskey(filled_dict, "one") # => true
haskey(filled_dict, 1) # => false
false
Se pueden hacer listas desordenadas sin elementos repetidos de la siguiente forma
empty_set = Set() # => Set{Any}()
filled_set = Set([1,2,2,3,4]) # => Set{Int64}(1,2,3,4)
Set([4,2,3,1])
Sobre estos elementos se pueden hacer operaciones de conjuntos como los que se muestran a continuación
other_set = Set([3, 4, 5, 6]) # => Set{Int64}(6,4,5,3)
intersect(filled_set, other_set) # => Set{Int64}(3,4,5)
union(filled_set, other_set) # => Set{Int64}(1,2,3,4,5,6)
setdiff(Set([1,2,3,4]),Set([2,3,5])) # => Set{Int64}(1,4)
Set([4,1])
Para las estructuras if-else no afecta la identación, y se muestra de la siguiente forma
some_var = 5
if some_var > 10
println("some_var is totally bigger than 10.")
elseif some_var < 10
println("some_var is smaller than 10.")
else
println("some_var is indeed 10.")
end
some_var is smaller than 10.
El ciclo for actua sobre iterables (Range, Array, Set, Dict y AbstractString)
for animal=["dog", "cat", "mouse"]
println("$animal is a mammal")
end
dog is a mammal cat is a mammal mouse is a mammal
En los diccionarios se puede iterar sobre la llave-valor (se puede usar indiferentemente el = o el in)
for (k,v) in Dict("dog"=>"mammal","cat"=>"mammal","mouse"=>"mammal")
println("$k is a $v")
end
mouse is a mammal cat is a mammal dog is a mammal
El ciclo while se realiza de la siguiente manera
x = 0
while x < 4
println(x)
x += 1
end
0 1 2 3
Las funciones retornan la última sentencia
function add(x, y)
println("x is $x and y is $y")
x + y
end
add(1,3)
x is 1 and y is 3
4
Se pueden hacer funciones como asignaciones también
f_add(x, y) = x + y # => "f (generic function with 1 method)"
f_add(3, 4) # => 7
7
Para devolver varios valores se pueden usar tuplas
f(x, y) = x + y, x - y
f(3, 4) # => (7, -1)
(7,-1)
Para tener una cantidad indefinida de valores se puede usar el operador splat
function varargs(args...)
println(args)
end
varargs(1,2)
varargs(1,2,3,4)
(1,2) (1,2,3,4)
Este operador también se puede usar para "distribuir" los argumentos
add([5,6]...) # esto es equivalente a add(5,6)
x = (5,6) # => (5,6)
add(x...) # esto es equivalente a add(5,6)
x is 5 and y is 6
11
x is 5 and y is 6
Para los valores por defecto como argumentos como para la elección del parámetro
function defaults(a,b,x=5,y=6)
return "$a $b and $x $y"
end
defaults(1,2)
defaults(1,2,3)
function keyword_args(;k1=4,name2="hello") # importante el ;
return Dict("k1"=>k1,"name2"=>name2)
end
keyword_args(name2="ness") # => ["name2"=>"ness","k1"=>4]
Dict{ASCIIString,Any} with 2 entries: "name2" => "ness" "k1" => 4