On 09/05/2013 05:22 AM, Meta wrote:
While browsing Hacker News I came across this announcement of a physics
engine written in Rust. Just browsing through the code, I noticed that
it looks extremely arcane. I guess after awhile it's something you could
get used to, but it seems somewhat ironic that the author says that C++
will die of ugliness, when Rust already has syntactic monstrosities such
as these:
pub struct BodyWorld<N, LV, AV, M, II, CM> {
world: World<N, Body<N, LV, AV, M, II>, Constraint<N, LV, AV, M, II>>,
forces: @mut BodyForceGenerator<N, LV, AV, M, II>,
integrator: @mut BodySmpEulerIntegrator<N, LV, AV, M, II>,
detector: @mut BodiesBodies<N, LV, AV, M, II, BF<N, LV, AV, M, II>>,
sleep: @mut IslandActivationManager<N, LV, AV, M, II>,
ccd: @mut SweptBallMotionClamping<N, LV, AV, M, II, BF<N, LV, AV,
M, II>>,
joints: @mut JointManager<N, LV, AV, M, II>,
solver: @mut AccumulatedImpulseSolver<N, LV, AV, M, II, CM>
}
This stuff is downright arcane.
Why? I cannot spot any syntax I wouldn't get used to quickly in this
example. (AFAIK the @ are going away in favour of a library solution
with more verbose syntax though.)
In D something similar would look like this:
struct BodyWorld(N, LV, AV, M, II, CM){
World!(N, Body!(N, LV, AV, M, II), Constraint!(N, LV, AV, M, II))
world;
BodyForceGenerator!(N, LV, AV, M, II)* forces;
BodySmpEulerIntegrator!(N, LV, AV, M, II)* integrator;
BodiesBodies!(N, LV, AV, M, II, BF!(N, LV, AV, M, II))* detector;
IslandActivationManager!(N, LV, AV, M, II)* sleep;
SweptBallMotionClamping!(N, LV, AV, M, II, BF!(N, LV, AV, M, II))* ccd;
JointManager!(N, LV, AV, M, II)* joints;
AccumulatedImpulseSolver!(N, LV, AV, M, II, CM)* solver;
}
Afaics there is not much of a difference. Arguably, having the
identifiers conveniently aligned to the left is actually a slight
advantage of rust's syntax.
Of course, the code contains a certain amount of duplication I wouldn't
really want to write down, and this could be improved in D:
struct BodyWorld(N, LV, AV, M, II, CM){
private alias Args = Seq!(N, LV, AV, M, II);
World!(N, Body!Args, Constraint!Args) world;
BodyForceGenerator!Args* forces;
BodySmpEulerIntegrator!Args* integrator;
BodiesBodies!(Args, BF!Args)* detector;
IslandActivationManager!Args* sleep;
SweptBallMotionClamping!(Args, BF!Args)* ccd;
JointManager!Args* joints;
AccumulatedImpulseSolver!(Args, CM)* solver;
}