Recently I made the same mistake several times, naming variables things like first, last, head or tail when those are verbs in historical Rebol. One case was porting some unrelated C code which named a variable "first". The other case was just repeating some habits from inside the interpreter implementation, where you can freely call things "head" or "tail".
This led me to wonder how much value there is in saying head x vs. head of x. It's pretty easy to type the latter, and the flow is reasonably natural.
Here's a line of historical code from CLEAN-PATH, which is a "heavy use case" of those functions:
if all [#"/" = last out #"/" <> last file] [
remove back tail out
]
Today we can make that flow more nicely:
all [#/ = last out, #/ <> last file] then [
remove back tail out
]
Now imagine that we rigged it up so that you had to use OF. I think even in this heavy usage case it's not so bad...arguably clearer:
all [#/ = last of out, #/ <> last of file] then [
remove back of tail of out
]
I think it's reasonable to say that if you're working on series a lot somewhere, you might find it convenient to shorten the notation...but as POINTFREE gets more convenient, maybe you could set those kinds of shorthands up as:
last: (<- last of)
tail: (<- tail of)
back: (<- back of)
The key here is asking if these shorthands are really the ones you want; or might it be more empowering to leave more words free in global space (especially ones that are more obviously nouns).
I've mentioned that it's becoming second nature these days to write things like first: first of x without blinking. It feels like we'd be better off going this route.
There's some technical questions here, about expanding the "OF-context". Things like FIRST and SECOND are specializations set up in usermode of PICK. So how do you put these specializations in where OF can find them? This suggests OF is picking out of an extensible scope of property accessors. Maybe if things work out with dualism of actions and objects, the context could have the same name...so you could just say:
>> of.first: <- pick _ 1
>> first of [a b c]
== a
Pushing on such approaches seems crucial to the problem of modules and contention for short words...