変数束縛構文
「束縛構文」?
よくある =
が本当に良いのか問題
手続き的な言語では
cint a = 42; // 左辺に右辺を代入する
関数型言語では
hslet a = 42 -- 右辺の値を左辺に束縛する
elixir
Erlangでも同じ
数学の =
と同等の意味
go
型推論を用いるときは :=
を使う
govar hoge int = 42
hoge := 42
perl
Perl全く知らないので間違ってるかも↓
pl$global = "global variance"
my $config = "hoge" # レキシカル変数
our $config = "hoge" # `use strict`した場合のglobal変数の宣言
local $config = "hoge"
state $config = "hoge" # サブルーチンに状態を持たせる特殊なレキシカル変数
js
var, const, let
rust
let
nim
let, var
kotlin
var, val
変数名の命名
Ruby
スコープに合わせて変数名の記号を変えた
グローバル変数: $foo
インスタンス変数: @foo
変数宣言時の予約後
letの意味
使役や許可を表す英単語の「let」から来てる。由来はLispかそれより前。
例えばさ、
先に式を書いて、その結果を変数に代入するとかは?
designif b {
return 42
} => hoge
これが微妙なときは逆も書けるとか
designhoge <= if b return 42
hoge <= 42
これを採用した時に、どういうデメリットが出そうか
個人的に微妙だと思うものにif文とかがあるが、それはこれで解決できないか
てかそもそも関数型言語などでは、値に名前を付けることは代入ではなく、束縛なのだから、わざわざ =
使わなくても良くないか?
例えば、 tag
とか name
関数にしてはどうか
designtag hoge 2 // hoge = 2
name piyo 42 // piyo = 42
しかしこうすると、明示的に型を指定できなくなる
design// (:)演算子とか
hoge: 42
デメリット
LL(1)では実装できなくなる
hoge
だけを見た時に、それが変数定義なのか、変数呼び出しなのかが確定できない
「次の次のToken」が、 :=
かそれ以外かでパースする関数を変える必要がある
ちょっとずれるけど関連しそうな話
ローカル変数とスコープの話↑
そうか、Haskellの let x = 1+2
も遅延評価されるのか
つまり↑と書いただけでは、 x
に入っているのは 3
という値ではなく、 1+2
という計算、式
関連