You overcomplicated it. This works:
proc tap*[T](obj: T, code: proc(obj: T)): T =
code obj
obj
let code = proc(i: int) =
echo 2*i
var num = 123
echo num.tap(code)
Run
To make it feel more like the Ruby version, you can use an anonymous proc:
echo num.tap(proc(i: int) = echo 2 * i)
Run
