変数束縛構文
「束縛構文」?
よくある=が本当に良いのか問題
手続き的な言語では
code:c
int a = 42; // 左辺に右辺を代入する
関数型言語では
code:hs
let a = 42 -- 右辺の値を左辺に束縛する
elixir
code:ex
a = 42 # パターンマッチを用いる
Erlangでも同じ
数学の=と同等の意味
go
型推論を用いるときは:=を使う
code:go
var hoge int = 42
hoge := 42
perl
Perl全く知らないので間違ってるかも↓
code: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かそれより前。
例えばさ、
先に式を書いて、その結果を変数に代入するとかは?
code:design
if b {
return 42
} => hoge
これが微妙なときは逆も書けるとか
code:design
hoge <= if b return 42
hoge <= 42
これを採用した時に、どういうデメリットが出そうか
個人的に微妙だと思うものにif文とかがあるが、それはこれで解決できないか
てかそもそも関数型言語などでは、値に名前を付けることは代入ではなく、束縛なのだから、わざわざ=使わなくても良くないか?
例えば、tagとかname関数にしてはどうか
code:design
tag hoge 2 // hoge = 2
name piyo 42 // piyo = 42
しかしこうすると、明示的に型を指定できなくなる
code:design
// (:)演算子とか
hoge: 42
code:design
hoge := 42
デメリット
LL(1)では実装できなくなる
hogeだけを見た時に、それが変数定義なのか、変数呼び出しなのかが確定できない
「次の次のToken」が、:=かそれ以外かでパースする関数を変える必要がある
ちょっとずれるけど関連しそうな話
ローカル変数とスコープの話↑
そうか、Haskellのlet x = 1+2も遅延評価されるのか
つまり↑と書いただけでは、xに入っているのは3という値ではなく、1+2という計算、式
関連