¿Cómo representar una partícula?

Necesito: posición $x$, velocidad $v$, masa $m$, [carga $q$, color...]


In [5]:
x = 3.
v = 1.
m = 1.


Out[5]:
1.0

Mover la partícula:


In [8]:
function mover(x, v, δt) 
    x = x + v*δt
end


Out[8]:
mover (generic function with 2 methods)

In [7]:
mover(1)


Out[7]:
4.0

In [15]:
x


x not defined
while loading In[15], in expression starting on line 1

In [16]:
x2 = 1
v2 = 3


Out[16]:
3

Otra representación:


In [17]:
particula = [3, 4., "particulita"]
# son [x, v, etiqueta]


Out[17]:
3-element Array{Any,1}:
 3             
 4.0           
  "particulita"

In [18]:
dt = 0.5
particula[1] = particula[1] + dt * particula[2]

# NO SE ENTIENDE NADA


Out[18]:
5.0

La solución: tipos / objetos / clases

Voy hacer una caja que contiene cosas con nombres:


In [19]:
type Particula
    x
    v
    m
end

In [20]:
Particula


Out[20]:
Particula (constructor with 1 method)

In [21]:
methods(Particula)


Out[21]:
1 method for generic function Particula:
  • Particula(x,v,m)

In [22]:
p = Particula(1, 2, 3)


Out[22]:
Particula(1,2,3)

In [23]:
p


Out[23]:
Particula(1,2,3)

In [24]:
p.x


Out[24]:
1

In [25]:
p.v


Out[25]:
2

In [26]:
p.m


Out[26]:
3

In [27]:
dt = 0.5
p.x += p.v*dt  # equivalente a   p.x = p.x + p.v*dt


Out[27]:
2.0

In [28]:
p2 = Particula(4, 5, 6)


Out[28]:
Particula(4,5,6)

In [29]:
p


Out[29]:
Particula(2.0,2,3)

In [30]:
p2


Out[30]:
Particula(4,5,6)

In [31]:
p2.x, p2.v, p2.m


Out[31]:
(4,5,6)

In [32]:
p3 = Particula("hola", "soy", "yo")


Out[32]:
Particula("hola","soy","yo")

In [33]:
type Particula2
    x::Real
    v::Real
    m::Real
end

In [34]:
Particula2("HOLA", "y", "eso")


`convert` has no method matching convert(::Type{Real}, ::ASCIIString)
while loading In[34], in expression starting on line 1

 in Particula2 at no file

In [35]:
Particula2(-3, 10, Inf)


Out[35]:
Particula2(-3,10,Inf)

In [36]:
p


Out[36]:
Particula(2.0,2,3)

In [42]:
function mover!(p::Particula, dt)
    p.x += p.v * dt
end

function mover!(p::Particula2, dt)
    p.x += p.v * 3*dt
end


Out[42]:
mover! (generic function with 2 methods)

In [43]:
methods(mover!)


Out[43]:
2 methods for generic function mover!:
  • mover!(p::Particula,dt) at In[42]:2
  • mover!(p::Particula2,dt) at In[42]:6

In [44]:
methods(+)


Out[44]:
117 methods for generic function +:

In [39]:
mover(p, 1.)


Out[39]:
4.0

In [40]:
p


Out[40]:
Particula(4.0,2,3)

Sobrecarga de operadores


In [46]:
p1 = Particula(1, 2, 3)
p2 = Particula(4, 5, 6)


Out[46]:
Particula(4,5,6)

In [47]:
p1 + p2


`+` has no method matching +(::Particula, ::Particula)
while loading In[47], in expression starting on line 1

Sólo como ejemplo:


In [48]:
function +(p1::Particula, p2::Particula)
    Particula(p1.x+p2.x, p1.v+p2.v, p1.m+3*p2.m)
end


Out[48]:
+ (generic function with 118 methods)

In [49]:
p1 + p2


Out[49]:
Particula(5,7,21)

In [50]:
+(p1, p2)


Out[50]:
Particula(5,7,21)

In [51]:
methods(+)


Out[51]:
118 methods for generic function +:

In [52]:
using ValidatedNumerics


Warning: Method definition IPv4(String,) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:31 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:31.
Warning: Method definition IPv6(String,) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:32 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:32.
Warning: Method definition isless(T<:IpAddr,T<:IpAddr) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:37 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:37.
Warning: Method definition Dict(Any,) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:49 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:49.
Warning: Method definition round(Type{T<:Integer},Integer) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:65 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:65.
Warning: Method definition round(Type{T<:Integer},Real) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:66 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:66.
Warning: Method definition round(Type{T<:Integer},Rational{T<:Integer}) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:67 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:67.
Warning: Method definition round(Type{T},AbstractArray{R,1}) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:69 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:69.
Warning: Method definition round(Type{T},AbstractArray{R,2}) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:72 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:72.
Warning: Method definition round(Type{T},AbstractArray{T,N}) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:75 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:75.
Warning: Method definition ceil(Type{T<:Integer},Integer) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:65 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:65.
Warning: Method definition ceil(Type{T<:Integer},Real) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:66 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:66.
Warning: Method definition ceil(Type{T<:Integer},Rational{T<:Integer}) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:67 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:67.
Warning: Method definition ceil(Type{T},AbstractArray{R,1}) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:69 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:69.
Warning: Method definition ceil(Type{T},AbstractArray{R,2}) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:72 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:72.
Warning: Method definition ceil(Type{T},AbstractArray{T,N}) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:75 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:75.
Warning: Method definition floor(Type{T<:Integer},Integer) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:65 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:65.
Warning: Method definition floor(Type{T<:Integer},Real) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:66 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:66.
Warning: Method definition floor(Type{T<:Integer},Rational{T<:Integer}) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:67 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:67.
Warning: Method definition floor(Type{T},AbstractArray{R,1}) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:69 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:69.
Warning: Method definition floor(Type{T},AbstractArray{R,2}) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:72 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:72.
Warning: Method definition floor(Type{T},AbstractArray{T,N}) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:75 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:75.
Warning: Method definition trunc(Type{T<:Integer},Integer) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:65 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:65.
Warning: Method definition trunc(Type{T<:Integer},Real) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:66 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:66.
Warning: Method definition trunc(Type{T<:Integer},Rational{T<:Integer}) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:67 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:67.
Warning: Method definition trunc(Type{T},AbstractArray{R,1}) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:69 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:69.
Warning: Method definition trunc(Type{T},AbstractArray{R,2}) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:72 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:72.
Warning: Method definition trunc(Type{T},AbstractArray{T,N}) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:75 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:75.
Warning: Method definition rand(Type{Bool},) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:182 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:182.
Warning: Method definition parse(Type{T<:Integer},Char) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:203 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:203.
Warning: Method definition parse(Type{T<:Integer},Char,Integer) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:204 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:204.
Warning: Method definition parse(Type{T<:Integer},String) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:205 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:205.
Warning: Method definition parse(Type{T<:Integer},String,Integer) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:206 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:206.
Warning: Method definition parse(Type{T<:Union(Float32,Float64)},String) in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:207 overwritten in module Compat at /Users/dsanders/.julia/v0.3/Compat/src/Compat.jl:207.

In [53]:
a = Interval(1, 2)


Out[53]:
[1, 2]

In [54]:
b = Interval(3, 4)


Out[54]:
[3, 4]

In [55]:
a + b


Out[55]:
[4, 6]

In [56]:
a - b


Out[56]:
[-3, -1]

In [57]:
Interval(0.1)


Out[57]:
[0.1, 0.1]

In [58]:
big(0.1)


Out[58]:
1.0000000000000001e-01 with 53 bits of precision

In [59]:
@interval(0.1)


Out[59]:
[9.9999999999999992e-02, 1.0000000000000001e-01]₅₃

In [60]:
macroexpand(:(@interval(0.1)))


Out[60]:
:(ValidatedNumerics.big_transf(0.1))

In [61]:
ValidatedNumerics.big_transf(0.1)


Out[61]:
[9.9999999999999992e-02, 1.0000000000000001e-01]₅₃

In [64]:
s = "x + y"


Out[64]:
"x + y"

In [66]:
typeof(s)


Out[66]:
ASCIIString (constructor with 2 methods)

In [67]:
expr = parse(s)


Out[67]:
:(x + y)

In [69]:
typeof(expr)


Out[69]:
Expr

In [70]:
dump(expr)


Expr 
  head: Symbol call
  args: Array(Any,(3,))
    1: Symbol +
    2: Symbol x
    3: Symbol y
  typ: Any

In [71]:
expr.args


Out[71]:
3-element Array{Any,1}:
 :+
 :x
 :y

In [72]:
expr.args[2] = :z


Out[72]:
:z

In [73]:
expr


Out[73]:
:(z + y)

In [74]:
z


z not defined
while loading In[74], in expression starting on line 1

In [75]:
y


y not defined
while loading In[75], in expression starting on line 1

In [76]:
z = 3
y = 4


Out[76]:
4

In [77]:
eval(expr)


Out[77]:
7

In [78]:
expr


Out[78]:
:(z + y)

In [79]:
z


Out[79]:
3

In [80]:
:z


Out[80]:
:z

In [81]:
z = [3, 4]
y = [4, 5]


Out[81]:
2-element Array{Int64,1}:
 4
 5

In [82]:
eval(expr)


Out[82]:
2-element Array{Int64,1}:
 7
 9

In [83]:
z = Particula(1,2,3)
y = Particula(10, 20, 30)


Out[83]:
Particula(10,20,30)

In [85]:
eval(expr)


Out[85]:
Particula(11,22,93)

In [86]:



Out[86]:
Particula(11,22,93)

In [91]:
macro transf(expr)
    @show expr
    expr.args[2] = :z
    @show expr
end

In [92]:
@transf(x+y)


expr => :(x + y)
expr => :(z + y)
Out[92]:
Particula(11,22,93)

In [93]:
@transf(x+x)


expr => :(x + x)
expr => :(z + x)
x not defined
while loading In[93], in expression starting on line 1

In [95]:
macro transf(expr)
    @show expr
    for i in 2:length(expr.args)
        if expr.args[i] == :x
            expr.args[i] = :z
        end
    end
    @show expr
end

In [96]:
@transf(x+y)


expr => :(x + y)
expr => :(z + y)
Out[96]:
Particula(11,22,93)

In [97]:
@transf(x+x)


expr => :(x + x)
expr => :(z + z)
Out[97]:
Particula(2,4,12)

In [98]:
@transf(2*x)


expr => :(2x)
expr => :(2z)
`*` has no method matching *(::Int64, ::Particula)
while loading In[98], in expression starting on line 1

In [100]:
z = 3


Out[100]:
3

In [101]:
@transf(2*x)


expr => :(2x)
expr => :(2z)
Out[101]:
6

In [102]:
macroexpand(:(@transf(x+y)))


expr => :(x + y)
expr => :(z + y)
Out[102]:
:(z + y)

In [103]:
macroexpand(:(@time sin(10)))


Out[103]:
quote  # util.jl, line 53:
    local #436#b0 = LastMain.Base.gc_bytes() # line 54:
    local #437#t0 = LastMain.Base.time_ns() # line 55:
    local #438#g0 = LastMain.Base.gc_time_ns() # line 56:
    local #439#val = sin(10) # line 57:
    local #440#g1 = LastMain.Base.gc_time_ns() # line 58:
    local #441#t1 = LastMain.Base.time_ns() # line 59:
    local #442#b1 = LastMain.Base.gc_bytes() # line 60:
    LastMain.Base.time_print(LastMain.Base.-(#441#t1,#437#t0),LastMain.Base.-(#442#b1,#436#b0),LastMain.Base.-(#440#g1,#438#g0)) # line 61:
    #439#val
end

In [104]:
s = :x


Out[104]:
:x

In [105]:
typeof(s)


Out[105]:
Symbol

In [107]:
ex = :(x + y)


Out[107]:
:(x + y)

In [108]:
typeof(ex)


Out[108]:
Expr

In [109]:
ex = :(x + 3y^2 - sin(16))


Out[109]:
:((x + 3 * y^2) - sin(16))

In [110]:
typeof(ex)


Out[110]:
Expr

In [111]:
dump(ex)


Expr 
  head: Symbol call
  args: Array(Any,(3,))
    1: Symbol -
    2: Expr 
      head: Symbol call
      args: Array(Any,(3,))
        1: Symbol +
        2: Symbol x
        3: Expr 
          head: Symbol call
          args: Array(Any,(3,))
          typ: Any
      typ: Any
    3: Expr 
      head: Symbol call
      args: Array(Any,(2,))
        1: Symbol sin
        2: Int64 16
      typ: Any
  typ: Any

In [112]:
ex = :(eig(M))


Out[112]:
:(eig(M))

In [113]:
dump


Out[113]:
dump (generic function with 12 methods)

In [114]:
dump(ex)


Expr 
  head: Symbol call
  args: Array(Any,(2,))
    1: Symbol eig
    2: Symbol M
  typ: Any

In [115]:
Meta.show_sexpr(ex)


(:call, :eig, :M)

In [ ]: