They're different because they don't actually exist. Observe:
arc> def
#3(tagged mac #<procedure>)
arc> fn
Error: "reference to undefined identifier: _fn"
Since def is a macro, we can use it anywhere we like. But since fn is not, we can only use it in the head of a list, and it can't be overridden. fn, if, etc. should be first class: if not macros, then (type fn) should be 'prim or some such thing.