Hello,
I want to design a new data type that acts like Complex. What’s amazing is that by the identifier “im”, Julia compiler could recognize for example 1+1im as a complex number. That looks like a special form of struct to me.
My need comes from usage habit of people in some specific fields. For example in electricity, people use “L” to denote a inductor and “C” to denote a capacitor. In osscasions that they use these symbols a lot, type in “1e-9L” to denote a inductor that has value=1e-9 is certainly more convenient than input “Inductor(1e-9)”, if the struct Inductor is defined.
I have no idea how to google this. Thank you for any help or hint.
DNF
November 1, 2021, 7:39am
2
Yes, you can do this yourself. There’s no special parsing for im
, so you can create your own notation L
and C
.
The best way to get started is probably looking at the source of complex. Try typing
jl> @edit complex(0, 1)
to see the source.
2 Likes
Thank you very much! That’s exactly what I need.
Bardo
November 1, 2021, 4:21pm
4
DNF:
@edit complex(0, 1)
Yes, thanks, but this throws an error here:
julia> @edit complex(0, 1)
ERROR: IOError: could not spawn `code -g 'C:\Users\xxx\AppData\Local\Programs\Julia-1.7.0-rc1\share\julia\base\complex.jl:171'`: no such file or directory (ENOENT)
Stacktrace:
[1] _spawn_primitive(file::String, cmd::Cmd, stdio::Vector{Any})
@ Base .\process.jl:100
[2] #690
@ .\process.jl:113 [inlined]
[3] setup_stdios(f::Base.var"#690#691"{Cmd}, stdios::Vector{Any})
@ Base .\process.jl:197
[4] _spawn
@ .\process.jl:112 [inlined]
[5] _spawn(::Base.CmdRedirect, ::Vector{Any})
@ Base .\process.jl:140
[6] run(::Base.CmdRedirect; wait::Bool)
@ Base .\process.jl:449
[7] (::InteractiveUtils.var"#2#3"{Bool, InteractiveUtils.var"#11#21", Vector{String}})(cmd::Cmd, path::String, line::Int32)
@ InteractiveUtils C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.7\InteractiveUtils\src\editless.jl:98
[8] edit(path::String, line::Int32)
@ InteractiveUtils C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.7\InteractiveUtils\src\editless.jl:205
[9] edit(f::Any, t::Any)
@ InteractiveUtils C:\buildbot\worker\package_win64\build\usr\share\julia\stdlib\v1.7\InteractiveUtils\src\editless.jl:234
[10] top-level scope
@ REPL[57]:1
complex.jl exists in
C:\Users\xxx\AppData\Local\Programs\Julia-1.7.0-rc1\share\julia\test
C:\Users\xxx\AppData\Local\Programs\Julia-1.7.0-rc1\share\julia\base
Opened another thread .
There’s really nothing special about im
. It’s literally just defined as Complex(false, true)
:
# Examples
```jldoctest
julia> im * im
-1 + 0im
julia> (2.0 + 3im)^2
-5.0 + 12.0im
```
"""
const im = Complex(false, true)
const ComplexF64 = Complex{Float64}
const ComplexF32 = Complex{Float32}
const ComplexF16 = Complex{Float16}
Complex{T}(x::Real) where {T<:Real} = Complex{T}(x,0)
Complex{T}(z::Complex) where {T<:Real} = Complex{T}(real(z),imag(z))
(::Type{T})(z::Complex) where {T<:Real} =
isreal(z) ? T(real(z))::T : throw(InexactError(nameof(T), T, z))
rdeits
November 1, 2021, 6:28pm
6
In addition to what @simeonschaub said, the extra piece of information is that Julia allows you to write 3im
and get 3 * im
. This works for any variable name, so im
is not special:
julia> x = 2
2
julia> 3x
6
1 Like
That’s right, I looked into the source code and found this as well. Thanks
That seems to be an ideal solution, I think I’ll switch my code to Unitful.jl at some point.