Go と Python の式の評価順

Go

Order of evaluation から。

関数内では、式のオペランド・代入・return 文・すべての関数呼び出し・メソッド呼び出し・(チャネルの)通信演算(communication operations)は字句の左から右の順に評価される。

たとえば

y[f()], ok = g(h(), i()+x[j()], <-c), k()

では f()h()i()j()<-cg()k() の順に関数呼び出しと通信が行われる。でも x の評価とインデクシング、および y の評価と比べての順序は決められていない。

a := 1
f := func() int { a++; return a }
x := []int{a, f()}
m := map[int]int{a: 1, a: 2}
n := map[int]int{a: f()}

という例では

  • x[1, 2] または [2, 2] となる。af() の評価順は不定
  • m{2: 1} または {2: 2} となる。map の代入の評価順は不定
  • n{2: 3} または {3: 3} となる。キーと値の評価順は不定

らしい。http://play.golang.org/p/F_E-lfJIOR では全部後者になった。

Read More


Python と Go の多重代入

7.2. Assignment statements から

x = [0, 1]
i = 0
i, x[i] = 1, 2
print(x)

[0, 2] がプリントされる。[2, 1] がプリントされると思っていた。a, b = b, a のように値を交換するときには左辺と右辺が同時に評価されると思っていたから。

そうではなくて多重代入の場合は、まず右辺でタプルを生成した後で左辺の左から順に代入していると考えるといいのかも。

  1. i, x[i] = 1, 2
  2. i, x[i] = (1, 2)
  3. i = (1, 2)[0]
  4. x[i] = (1, 2)[1]

というふうに。これなら値の交換のときも

  1. a, b = b, a
  2. a, b = (b, a)
  3. a = (b, a)[0]
  4. b = (b, a)[1]

で矛盾しない。

>>> x = [1, 2, 3]
>>> x[0], x[x[0]] = x[1], x[0]
>>> x
[2, 2, 1]

のように右辺で x の要素を参照するような場合もこの解釈でいける。

Go では逆に左辺と右辺が同時に評価されるような結果になった。


Assignments で規定されていた。左辺のインデックス式とポインタの間接参照、および右辺の式がすべて評価された後で、左から右に順に代入される。


Although the definition of assignment implies that overlaps between the left-hand side and the right-hand side are ‘simultanenous’ (for example a, b = b, a swaps two variables), overlaps within the collection of assigned-to variables occur left-to-right, sometimes resulting in confusion. For instance, the following program prints [0, 2]:

x = [0, 1]
i = 0
i, x[i] = 1, 2         # i is updated, then x[i] is updated
print(x)

7. Simple statements — Python 3.4.1 documentation

Go だと [2 1] が print された。

Source: docs.python.org




Go コードのレビュー時によくされるコメント

CodeReviewComments から Go コードのレビュー時によくされるコメントについて。

gofmt

gofmt またはそのスーパーセットである goimports を実行すること。goimports は gofmt に加えて import の追加と削除も行う。

コメント文

http://golang.org/doc/effective_go.html#commentary を参照。宣言に対するコメントは少し冗長に見えるかもしれないけど完全な文にする。そうすれば godoc できれいに整形される。次のように説明するものの名前から始めピリオドで終える。

// A Request represents a request to run a command.
type Request struct { ...

// Encode writes the JSON encoding of req to w.
func Encode(w io.Writer, req *Request) { ...

Read More


initialism(頭文字語):各単語の頭文字(initial letter/word)をつなげたもので、アルファベットを一つずつ発音するもの。最近ではネット語(Netspeak)で多用されている。
 例:GP(=general practitioner):一般開業医、RN(=registered nurse):正看護婦、3R’s

acronym(頭字語):頭文字語の中でも、とくに一つの単語のように発音が可能なもの。
 例:NASA(=National Aeronautics and Space Administration):米航空宇宙局

ちなみに、acronymの語源は、acro(先端・頂点・高所)+nym(=name)→「単語の各先端を集めてできた名詞」です。頭文字を並べただけのinitialismの-ism(~表現)とは違い、-nymに「単語化されている」という特徴がよく現れていると思います。

頭文字語と頭字語: やまちゆうの英語ブログ

Source: rhymosphere.cocolog-nifty.com


1 2 3 4 5