How can I keep the space between a math function and its operand in parentheses?

When I write a prefix mathematical function (specifically an op) (like sin) applied to a literal number, it is shown with a space between the function and the operand. But, when I write the function applied to an expression in parentheses, there is no space between the function and the operand. That is shown in the example at the end.

How can I keep the space between the function and the operand when the operand is an expression in parentheses? The idea is that the the literal number and the expression in parentheses mean the same thing, so they should be treated the same way in the notation. That would be useful for a Haskell-like notation where functions are applied by juxtaposition, not by parentheses.

I could put every such operand in a box like on the third line of the example, but that is impractical because it requires too much extra code. So I am looking for a practical solution which could be applied to all ops. Ideally, I could redefine spacing rules for the math mode.

$sin 5$ \
$sin (2+3)$ \
$sin #box($(2+3)$)$

I wonder if it would be nice to just use “normal text” defaults to lay it out?

A CPS-style call to a DFS search for a node with value greater than $3$:
$
"dfs" (lambda x.(x>3)) "start sc fc"
$
This works too, and might be more semantically nice, but more quotations must be typed:
$
"dfs" (lambda x.(x>3)) "start" "sc" "fc"
$
If we really want to be pedantic, we might specify a math class like so:
#let dfs = math.class("normal", "dfs")
$
dfs (lambda x.(x>3)) "start" "sc" "fc"
$
That probably gets even more tedious, though. 

Here's another usage example:
$
"nonsensefn" 3 " " 4 " " (lambda x.("predicate" not x))
$

Ok, well, we run into this other spacing issue (if there are only the numbers there, they collapse together, even if they're strings e.g. `"3" "4"`), so hopefully someone can link the discussion on that.