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