On Sun, Feb 24, 2013 at 12:06 AM, Ashish Myles <[email protected]> wrote:
> On Fri, Feb 22, 2013 at 12:35 PM, John Clements
> <[email protected]> wrote:
>>
>> On Feb 22, 2013, at 6:22 AM, Paul Stansifer wrote:
>>
>> > Rust syntax expects a literal number in the `[T * n]` construct; from the
>> > parser's point of view, what it receives is an expression, without any
>> > information that it is a number. (There are internal reasons for this, but
>> > it also makes the behavior of `$` more consistent; for example, preventing
>> > Rust from having C's issue where everybody has to use lots of parentheses
>> > in macro definitions.) Implementing $n:integer in Rust is a possible
>> > solution, but not likely to happen very soon.
>> >
>> > Unfortunately, I can't think of a workaround that generates the same type.
>>
>> More or less as a note to myself and Paul: I claim that this problem would
>> be solved by a token-tree-based macro system.
>>
>> John
>>
>
> I just want to add for consideration: I hope the (eventually)
> implemented solution allows compile-time evaluable integer expressions
> for maximal expressivity. Same thing for $n:bool, etc, if implemented.
>
Wait a sec...I guess we are barking up the wrong tree. The problem is
not that rust macros don't support $n:integer, but that static array
initialization seem to require a raw integer literal (possibly at the
parsing level). One can imagine designing a statically-allocated
matrix for size C1 x C2 that would allocate similar to:
const C1 : int = 2;
const C2 : int = 2;
let a : [int * (C1*C2)] = [1,2,3,4];
But the code above gives the following error
error: expected integral vector length but found `(`
If this misbehavior were fixed, I think the macro system would not
need to accommodate ints and other types specially, keeping it
fundamentally simpler. I would think that anything that requires a
compile-time integer should be able to receive a compile-time
evaluable integer expression. Ideally, it would be great if Rust went
further to allow something like
let a : [int * choose(C1, C2)];
or
const C3 = choose(C1, C2);
let a : [int * C3];
where choose is a pure function that returns n-choose-k.
Any thoughts?
Ashish
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev