(f x) works this way in Lisp - as in the joke - and Lisp descendants like Scheme. And then there’s Haskell which takes the whole thing a step further still.
Also Perl, because Larry thought it would be fun(ctional). The external parentheses are technically optional in this case, but won’t break anything if included. Regular f(x) syntax is also supported there. (You could probably remake this meme with Python and Perl in first and second panels tbh.)
And I know of at least one dialect of BASIC that allowed subroutine calls to lack their parentheses, so the same external parentheses thing would apply if that subroutine was a function.
My mistake. I had somehow missed or forgotten that Lisp also supports currying, which is what I was thinking of as Haskell taking further. There might be other things regarding type declaration and such, but that’s a little beyond me to confirm or deny at the moment.
In Haskell, all functions are curried by default, so you can partially apply a function merely by applying it to fewer than the supported number of arguments.
Also, it is worth noting that laziness-by-default in Haskell makes it so that you can use ordinary functions to define control structures, rather than needing to turn to metaprogramming like you do in Lisp.
In haskell, any function with a name made entirely out of symbols (like + or >>=) works as an infix operator (you can turn any function into an infix operator using backticks)
Now that you mention it, I do remember the backticks and symbols thing for infix, so yeah that’d be something extra that Haskell did. One of the few things about Haskell that wasn’t on the fringes of my capability and understanding as I recall.
I remember thinking that it would be cool if other, more procedural, languages allowed it, but then most other languages also don’t have the capability of setting the precedence of new operators relative to old ones on the fly. A lot of that stuff is hard-coded into those languages’ compilers.
(f x)works this way in Lisp - as in the joke - and Lisp descendants like Scheme. And then there’s Haskell which takes the whole thing a step further still.Also Perl, because Larry thought it would be fun(ctional). The external parentheses are technically optional in this case, but won’t break anything if included. Regular
f(x)syntax is also supported there. (You could probably remake this meme with Python and Perl in first and second panels tbh.)And I know of at least one dialect of BASIC that allowed subroutine calls to lack their parentheses, so the same external parentheses thing would apply if that subroutine was a function.
Wait, what works in Haskell that doesn’t in Lisp, exactly? Are the spaces not just function composition?
My mistake. I had somehow missed or forgotten that Lisp also supports currying, which is what I was thinking of as Haskell taking further. There might be other things regarding type declaration and such, but that’s a little beyond me to confirm or deny at the moment.
In Haskell, all functions are curried by default, so you can partially apply a function merely by applying it to fewer than the supported number of arguments.
Also, it is worth noting that laziness-by-default in Haskell makes it so that you can use ordinary functions to define control structures, rather than needing to turn to metaprogramming like you do in Lisp.
In haskell, any function with a name made entirely out of symbols (like + or >>=) works as an infix operator (you can turn any function into an infix operator using backticks)
Now that you mention it, I do remember the backticks and symbols thing for infix, so yeah that’d be something extra that Haskell did. One of the few things about Haskell that wasn’t on the fringes of my capability and understanding as I recall.
I remember thinking that it would be cool if other, more procedural, languages allowed it, but then most other languages also don’t have the capability of setting the precedence of new operators relative to old ones on the fly. A lot of that stuff is hard-coded into those languages’ compilers.