Rust Code in the Wild

John Colvin john.loughran.colvin at gmail.com
Thu Sep 5 07:02:31 PDT 2013


On Thursday, 5 September 2013 at 13:50:59 UTC, Timon Gehr wrote:
> 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;
> }

That's a pretty clear win for D, although there may be a way to 
do something similar in rust.


More information about the Digitalmars-d mailing list