Earlier quoted context omitted.
I don't know Ruby. In your example, if you're comparing the function itself, it is true that f == f But it's not true if that's function invocation and there are implicit arguments. Applying a function and comparing its definition are of course different. The evaluation strategy must come after we agree whether we're comparing values after invocation or definitions. If it's invocations, the evaluation strategy you pi…
What does it mean to compare a function to itself without evaluating it?
A straightforward way can be to simply compare the text of the functions, as written in your programming language of choice, in this case Ruby.
Just take the text of both functions, do a diff, and if it says they are the same, they are the same.
Another comparison could be more abstract, since we know there's more than one way to accomplish the same with a programming language: two functions are the same if, given the same input, they produce the same output. You can either prove this by extension, if the number of possible inputs is finite and small, or you can prove it logically. With some languages which enforce purity using types, you can even show two functions are the same just by looking at their signatures, no need to evaluate anything! (this is one advantage of some statically typed languages, by the way!)
> There are no implicit arguments to the function I have in mind. Passing an argument to the function I have in mind is an error.
Yes, there are implicit arguments. You don't see them because they are implicit! A function that returns the moment in time, "now", of course depends on an implicit argument: the current time! How else is it going to know the moment of "now", otherwise? Think about how such a function is implemented.