Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

是否該有個反方向的賦值算符?

1 view
Skip to first unread message

Kang-min Liu

unread,
Sep 14, 2022, 10:46:23 PM9/14/22
to

https://youtu.be/g8xXrhjqOZM

Damian Conway 在這場於 2017 年 The Perl Conference Amsterdam 的演講中,
於 19:04 處,他開始描述這個重複出現的 code pattern (Raku 語。當時仍名為 Perl 6):

@tape[$head] = .<write> if defined .<write>;
$state = .<state> if defined .<state>;

也就是在意圖要描述「在某個值為不為 undef 時,才將某個值存到某變數中」。
這個代表「某個值」的算式必須在同一行陳述裡面出現兩次。是個重複出現的東西。

然後他以定義新算符 ?= 的手法,將其重構為:

sub infix:< ?= > ($lval is rw, $rval) { $lval = $rval if defined $rval; }

@tape[$head] ?= .<write>;
$state ?= .<state>;

關於這個 "?=" 算符,雖然在符號的使用上有點像是 js / kotlin 中的
safe-navigation "?.",只是其測試對象是在其右方,閱讀方向正好相反。有點像
是主詞位置變到句尾去的感覺。

如果有個反方向的賦值算符,能把其左方的值存在其右方,比方說以下這個 infix assign-to:

sub infix:< assign-to > ($lval, $rval is rw ){ $rval = $lval }

42 assign-to $a;

say $a; #=> 42

那麼基於類似概念而定義出來的 infix ?assign-to 算符,在閱讀方向上就與 safe-navigation 相同了

sub infix:< ?assign-to > ($lval, $rval is rw ){ $rval = $lval if defined $lval }

$a ?assign-to $b;

如果要去把「$a ?assign-to $b」這一句給唸出來的話,就類似:

$a, 如果不是 undef 的話,就存到 $b 裡面

至少,對於已經讀慣 safe-navigation 的人而言,應該是個比較親切的 code pattern。

--
0 new messages