Sorry, it's all my fault, actually it works quite well
I found the culprit: this line in my config file:
;;(setq slime-find-buffer-package-function 'find-mit-scheme-package)
The buffer's current package is determined by the line (in-package ...) in the buffer, the above line of config causes it not to work. I wonder why I always had got ? in the mode line which should be the name of the buffer's current package.
Sorry for the noise. It is really perfect!
C-c C-c ie slime-compile-defun on a function with ccl will always define or redefine the function in the package CL-USER regardless of which package the repl is currently in, while with sbcl slime-compile-defun will change the function in the package that the repl is currently in which is pretty much what I want.