I feel compelled to ask for the reopening of this question. I do not think it duplicates the question Mr.Wizard identifies as being duplicated. This question is about the explicit use of Evaluate at different levels of an expression and it's interaction with SetDelayed. The other question is about the explicit use of Evaluate and it's interaction with Function. For experienced Mathematica users, the two question are related, so it is no coincidence that part of Mr.Wizard's answer to the other question is applicable to this question. ...
–
m_goldbergMay 16 '14 at 1:28

... But, despite the relationship, I assert that this question is sufficiently different that less experienced users, should they follow the link, will be more confused than enlightened. Should this question be reopened, I suggest the link to the other question be given in a comment.
–
m_goldbergMay 16 '14 at 1:29

@m_goldberg Okay, we'll try it your way. I posted a modified version of my original answer here. I await the community's feedback.
–
Mr.Wizard♦May 16 '14 at 3:18

Kuba explained what went wrong. This example will show you how to get the behavior you were probably expecting. Just use Set ( = ) instead of SetDelayed ( := ). This will get f evaluated at right time and will work for arbitrarily deeply nested calls to f.

Evaluate only works when it is the explicit head of an argument. In other words Evaluate[ . . . ] must appear as one of the arguments of the Head who's Hold attribute you wish to override. You should read this paper, which teaches this among many other useful things:

Mathematica is a registered trademark of Wolfram Research, Inc. While the mark is used herein with the limited permission of Wolfram Research, Stack Exchange and this site disclaim all affiliation therewith.