Interesting.
> EVAL isn't call/return, it's a mathematical function
Hmm...a "function" you say. What do you do with a function in a computer system? I mean, for it to actually do something?
Look at it?
Digest it?
Sing it?
Or maybe...call it?
And when that function is done, after you called it what does it do?
Dissolve?
Perambulate?
Or maybe: return?
Of course, a function that you call and that then returns has absolutely nothing to do with the call/return architectural style. Sorry, my bad, what was I thinking?
And no, your example does not invalidate what I wrote, as it doesn't implement it "cleanly and directly", at least not to my standards. Maybe to yours, but not to mine. The problem with Lisp DSLs is that the result always just look like Lisp, and Lisp is eval/apply.
So
(send my-actor message_args)
very much looks like a Lisp function call. It seems to be the function "send" with arguments "my-actor" and "message_args". (Of course the Actor model is close enough that it might not matter). Which is exactly the problem we have in other languages.
At the very least, it would have to be
my-actor async messge_args
For it to qualify as resembling an actual send and not just another function call.
I can also write:
source.connect( target );
And to you that would apparently mean that I have implemented pipes and filters "cleanly and directly" in, say, C++ and Java. And it would be just as wrong.