-
-
Notifications
You must be signed in to change notification settings - Fork 5.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Explicit syntax for reassigning a variable #51223
Comments
Seems like something for a macro? julia> macro update!(x, v)
esc(:($x; $x = $v))
end
@set! (macro with 1 method)
julia> @update! foo 17
ERROR: UndefVarError: `foo` not defined
Stacktrace:
[1] top-level scope
@ REPL[38]:2
julia> foo = 17
julia> @update! foo 4
4
julia> foo
4 |
This is a reasonable proposal but obviously cannot be considered in 1.x (most of the value comes from disallowing some uses of |
@LilithHafner
I believe within the next couple years there will be a good customizable linter, so it will be possible for codebases to disallow reassignments that don't explicitly use |
Regarding the strict mode discussion #54903, I would much prefer that variables be non-reassignable by default. But in contrast to using
The benefit is that the |
I don't think I did. What I've suggested a few times is that we could use tmp = expr
x::typeof(tmp) = tmp Except with I recently also proposed that we could have a strict pragma disallowing implicit variable declaration with |
This is inspired by #51107 and #51183 where there is ambiguity between defining and reassigning. I still dislike that when writing
x =
inside a function I have to worry about whetherx
is defined in the enclosing scope.I like how Fortress distinguished reassignment with
:=
from defining with=
so it couldn't happen by accident (and as a one-character "tax" on reassignment). In Scheme/Racket assignment is(set! x 2)
.Suppose I want to always be explicit about whether I'm defining a new variable or changing the old one and have a linter disallow ambiguous cases. For defining a new variable there is
local x
. Could Julia also have a syntax for explicitly reassigning, likex := 2
?Example
Update: Pointed out on Discourse, a problem with the proposed syntax is that in Golang the rule is the other way around:
:=
is definition and=
is assignment. This could potentially cause confusion for some users. However, only 3% of Julia users use Go (2023 Julia survey) and, sociologically speaking, afaict Go's market doesn't have too much overlap with Julia's. Moreover, SQL and Mathematica, which share far more users with Julia, already use=
for different meanings without problem. Definition syntax is so ubiquitous everybody's gonna understand very quickly what the rule is. So I suspect it’s relatively unlikely to cause excessive confusion in practice. Also, having the slightly shorter=
syntax be for definition rather than reassignment is a nice mild encouragement in the right direction.Stefan suggested an opt-in to requiring
:=
for reassignment, or using<-
for reassignment.The text was updated successfully, but these errors were encountered: