For Grassmann.jl, I would like to customize the printing similar to the Complex
numbers. Consider:
julia> using Grassmann
julia> @basis tangent(ℝ^2,2,2) # 2D Grade, 2nd Order, 2 Variables
(⟨++₁₂⟩, v, v₁, v₂, ∂₁, ∂₂, v₁₂, ∂₁v₁, ∂₂v₁, ∂₁v₂, ∂₂v₂, ∂₁₂, ∂₁v₁₂, ∂₂v₁₂, ∂₁₂v₁, ∂₁₂v₂, ∂₁₂v₁₂)
julia> ∇ = ∂1v1 + ∂2v2
0v₁₂ + 1∂₁v₁ + 0∂₂v₁ + 0∂₁v₂ + 1∂₂v₂ + 0∂₁₂
julia> Expr(:call,:/,1,∇⋅∇)
:(1 / 0.0v₁ + 0.0v₂ + 1∂₁∂₁ + 1∂₂∂₂)
The problem is that when I embed my number in an Expr
there is ambiguity due to missing parenthesis.
julia> z = 1+im
1 + 1im
julia> Expr(:call,:/,1,z)
:(1 / (1 + 1im))
For Complex
numbers this is resolved by adding extra (...)
parenthesis around the printed value.
How can I customize the printing so that my numbers are also parenthesized in an Expr
like this?
You can have a look at how it’s defined for Base.Complex
with @edit show(stdin, 1.0im)
. It looks like you just need to overload Base.show_unquoted
. (In the lines below)
julia> Base.show_unquoted(stdout,1+im)
1 + 1im
this does not seem to reproduce the print behavior I am after, it should be (1 + 1im)
instead
You need to pass the outer operator precedence as well.
1 Like
This works:
julia> Base.show_unquoted(stdin, 1.0im, 0#=Don't know what this does, but it isn't used by Complex=#, Base.operator_precedence(:*))
(0.0 + 1.0im)
This new definition does what I need, which will go into the AbstractTensors.jl package
function Base.show_unquoted(io::IO, z::T, ::Int, prec::Int) where T<:TensorAlgebra
if T<:TensorMixed && Base.operator_precedence(:+) <= prec
print(io, "(")
show(io, z)
print(io, ")")
else
show(io, z)
end
end