# Dynamicly change the Base.show methods with using macro?

**URL:** https://discourse.julialang.org/t/dynamicly-change-the-base-show-methods-with-using-macro/77665
**Category:** New to Julia
**Created:** [March 10, 2022, 5:04am UTC](https://discourse.julialang.org/t/dynamicly-change-the-base-show-methods-with-using-macro/77665 "2022-03-10T05:04:02Z")
**Posts on this page:** 7
**Page:** 1

<div class="post-metadata">

### Author: ![Brian1](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/brian1/32/49250_2.png) [@Brian1](https://discourse.julialang.org/u/Brian1)
#### Post date: [March 10, 2022, 5:04am UTC](https://discourse.julialang.org/t/dynamicly-change-the-base-show-methods-with-using-macro/77665/1 "2022-03-10T05:04:02Z")

</div>

There is two methods showing Float64:

```julia
t1show(io,x::Float64)=begin
    if x<1e-3
        xshow=x/1e-4 |> x->round(2,digits=2)
        print(io,string(xshow)*" bp")
    else
        print(io,string(x))
    end
end

t2show(io,x::Float64)=print(io,string(x))

```

Sometimes I want using t1show to show Float64, I would run this code:

```julia
Base.show(io::IO,x::Float64)=t1show(io,x)

0.0004
"4 bp"

```

Othertimes, I would like to show Float64 with using t2show, then I have to run this code:

```julia
Base.show(io::IO,x::Float64)=t2show(io,x)
0.0004
0.0004

```

This is not convinient. So does there is a elegant way to get like this:

```julia
0.0004
0.0004

@somemacro t2show 0.0004
"4 bp"

0.0004
0.0004

```

---

<div class="post-metadata">

### Author: ![Brian1](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/brian1/32/49250_2.png) [@Brian1](https://discourse.julialang.org/u/Brian1)
#### Post date: [March 11, 2022, 8:07am UTC](https://discourse.julialang.org/t/dynamicly-change-the-base-show-methods-with-using-macro/77665/2 "2022-03-11T08:07:16Z")

</div>

Finally, I find a way to do it:

```julia
macro cshow(f,expr)
    func=eval(f)
    ft=methods(func)[1].sig.parameters[3]
    return quote
        Base.show(io::IO,a::$ft)=$func(io,a)
        x=$expr
        show(x)
        Base.delete_method(methods(Base.show,(IO,$ft))[1])
    end |>esc
end

@cshow t1show 0.0004
4 bp

0.0004
0.0004

```

---

<div class="post-metadata">

### Author: ![tomerarnon](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tomerarnon/32/3170_2.png) [@tomerarnon](https://discourse.julialang.org/u/tomerarnon)
#### Post date: [March 11, 2022, 8:40am UTC](https://discourse.julialang.org/t/dynamicly-change-the-base-show-methods-with-using-macro/77665/3 "2022-03-11T08:40:04Z")

</div>

Why not just call `t1show(0.0004)` when that’s what you want? What’s the advantage of the macro?

---

<div class="post-metadata">

### Author: ![Brian1](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/brian1/32/49250_2.png) [@Brian1](https://discourse.julialang.org/u/Brian1)
#### Post date: [March 11, 2022, 8:44am UTC](https://discourse.julialang.org/t/dynamicly-change-the-base-show-methods-with-using-macro/77665/4 "2022-03-11T08:44:34Z")

</div>

I use it in jupyter, when call t1show, it needs the parameter “io”.

---

<div class="post-metadata">

### Author: ![tomerarnon](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tomerarnon/32/3170_2.png) [@tomerarnon](https://discourse.julialang.org/u/tomerarnon)
#### Post date: [March 11, 2022, 8:48am UTC](https://discourse.julialang.org/t/dynamicly-change-the-base-show-methods-with-using-macro/77665/5 "2022-03-11T08:48:25Z")

</div>

You need to define `t1show(x) = t1show(stdout, x)`

---

<div class="post-metadata">

### Author: ![Brian1](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/brian1/32/49250_2.png) [@Brian1](https://discourse.julialang.org/u/Brian1)
#### Post date: [March 11, 2022, 9:33am UTC](https://discourse.julialang.org/t/dynamicly-change-the-base-show-methods-with-using-macro/77665/6 "2022-03-11T09:33:27Z")

</div>

I tried just now, This method has a problem, I have to define functions : `tshow(x::Float64) tshow(x::Vector)....`, this is not convnient.

---

<div class="post-metadata">

### Author: ![fredrikekre](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/fredrikekre/32/1688_2.png) [@fredrikekre](https://discourse.julialang.org/u/fredrikekre)
#### Post date: [March 11, 2022, 10:49am UTC](https://discourse.julialang.org/t/dynamicly-change-the-base-show-methods-with-using-macro/77665/7 "2022-03-11T10:49:47Z")

</div>

You can define a fallback: `tshow(x::Any) = show(x)`.
