Open alashworth opened 5 years ago
Comment by bob-carpenter Saturday Oct 21, 2017 at 23:13 GMT
This sounds like it'd be reasonable to add. It shouldn't be too hard. :
will have to be defined as an infix operator.
What should its precedence be? It would make sense to me to allow 1+2:3 + 9
with interpretation (1 + 2):(3 + 9)
? R goes the other way (for all arithmetic), making :
bind more tightly:
> 1+2:3+4
[1] 7 8
Associativity doesn't matter since it's output isn't the same type as its input.
Comment by bgoodri Sunday Oct 22, 2017 at 00:02 GMT
I guess it should be whatever it is for x[1 + 2:3 + 9].
On Sat, Oct 21, 2017 at 7:13 PM, Bob Carpenter notifications@github.com wrote:
This sounds like it'd be reasonable to add. It shouldn't be too hard. : will have to be defined as an infix operator.
What should its precedence be? It would make sense to me to allow 1+2:3 + 9 with interpretation (1 + 2):(3 + 9)? R goes the other way (for all arithmetic), making : bind more tightly:
1+2:3+4 [1] 7 8
Associativity doesn't matter since it's output isn't the same type as its input.
— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/stan-dev/stanc3/issues/1404, or mute the thread https://github.com/notifications/unsubscribe-auth/ADOrql7_AYgLU3LB7Przg6z2en1Ar9F-ks5sunqYgaJpZM4QBvjF .
Comment by bob-carpenter Sunday Oct 22, 2017 at 00:33 GMT
Excellent point. Current Stan treats :
as binding more loosely than arithmetic. So we get 1 + 2 : 3 + 9
with the same denotation as 3 : 12
in both of the existing contexts:
for (i in 1 + 2 : 3 + 9) ...
and
x[1+ 2 : 3 + 9]
Comment by VMatthijs Thursday Dec 13, 2018 at 13:03 GMT
This is difficult to add to Stan currently as it would lead to ambiguity. For example, is the following a valid Stan program if we add this behaviour
model {
int n = 5
for (i in 1:n) {
n += 1;
}
}
?
Observe that the for
could then either be interpreted as a for-loop over the range 1:n
or a foreach-loop over the array 1:n
. Both have slightly different operational semantics. Because our for-loops are like C for-loops, the upper bound gets reevaluated after each pass through the loop body. In particular, for-loops might not terminate. For foreach-loops, the array gets evaluated once before we enter the loop and then becomes immutable.
Comment by bob-carpenter Thursday Dec 13, 2018 at 13:56 GMT
This program is currently valid and will evaluate the loop body for i in { 1, 3, 5 }.
With "1:n" this would be ambiguous between a foreach loop where "1:n" denotes an int[] and a regular loop where "1:n" are just the loop bounds.
This is a behavior we could change in Stan 3. I believe Matthijs has suggested making the loop bounds immutable in the body, so it's effectively the foreach interpretation.
his could get tricky syntactically if the bound is a function, say
for (i in 1:f(x,y,z))
We presumably wouldn't want any of x, y, z being mutated in the loop body. This would settle on the foreach s
On Dec 13, 2018, at 8:03 AM, Matthijs Vákár notifications@github.com wrote:
This is difficult to add to Stan currently as it would lead to ambiguity. For example, is the following a valid Stan program if we add this behaviour
model { int n = 5 for (i in 1:n) { n += 1; } }
?
Observe that the for could then either be interpreted as a for-loop over the range 1:n or a foreach-loop over the array 1:n. Both have slightly different operational semantics. Because our for-loops are like C for-loops, the upper bound gets reevaluated after each pass through the loop body. In particular, for-loops might not terminate. For foreach-loops, the array gets evaluated once before we enter the loop and then becomes immutable.
— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or mute the thread.
Issue by bgoodri Saturday Oct 21, 2017 at 22:48 GMT Originally opened as https://github.com/stan-dev/stan/issues/2424
Summary:
It is a parser error to declare and define a one-dimensional integer array using the colon operator.
Description:
It is a parser error to declare and define a one-dimensional integer array using the colon operator.
Reproducible Steps:
Try to parse the following Stan program
Current Output:
Expected Output:
Nothing. It should assign the integers from
1
toK
toarr
Additional Information:
Current Version:
v2.17.0