That does not establish that Luau should have them.
Other engines having an abstraction is not evidence that the abstraction is appropriate for Luau. Luau is not C++, Godot, or Unity, and every piece of runtime machinery added to Luau has an implementation and execution cost.
If the same behavior can already be expressed with basic Luau primitives, adding another runtime abstraction needs an actual justification.
“Other engines do it” is not that justification.
Because BindableEvents are not designed to be a general-purpose “signal” abstraction.
They are useful for communication across VM/sandbox boundaries, which is a completely different problem.
I’ve already explained this multiple times. Replacing a primitive designed for cross-boundary communication with a new runtime signal system simply because someone wants signal-like syntax is backwards.
I don’t see why that requires a signal abstraction.
Iterate an array of functions.
That’s your signal.
for _, callback in callbacks do
callback(...)
end
There is no need to “larp” a signal into existence with another layer of runtime machinery when the underlying operation is already trivial.
If there is some optimization that specifically requires a dedicated signal primitive, then explain what optimization it is and why it cannot be achieved with the existing primitives. (Real arguments only, no “trust the vibes”)
It does.
You can suspend the current coroutine and resume it later without introducing a signal abstraction.
For example:
task.delay(1, coroutine.running())
coroutine.yield()
The point is not that this exact snippet should replace every possible implementation. The point is that Wait() is not evidence that a dedicated signal object is necessary.
The code you provided is heavily structured around the concept of a “signal” rather than around the actual operation being performed.
That’s exactly the problem I’m criticizing.
Instead of asking:
“How do I implement this behavior?”
you’re asking:
“How do I make this behavior look like a signal?”
Those are not the same problem.
That is irrelevant to the argument.
The age of an API does not determine whether its current use case is appropriate.
What matters is what those instances are designed to do and what problem they are solving today.
Their historical existence does not establish that Luau needs another signal abstraction on top of them.
What are you referring to here?
I don’t understand what createsignal function you’re referring to in the coroutine library. If you’re referring to a specific API, please provide it, because there is no explanation here of what you mean.
At this point, I think the fundamental disagreement is pretty clear:
You are looking at signals as a useful abstraction that should exist because similar abstractions exist elsewhere.
I’m looking at the same problem and seeing an operation that can already be expressed directly with existing Luau primitives.
If the abstraction provides a concrete benefit that justifies its additional runtime machinery, demonstrate that benefit.
Until then, adding another layer simply because other engines have one is bloat.
No step back to the bloat. 
