Go 言語仕様の読書メモ

Go 言語をやってみようと思い立ち http://golang.org/ref/spec を読む.

# が行頭に来ているのは, 筆者自身のコメント

Introduction

汎用言語だとか GC あるとか仕様がコンパクトで (おそらく静的な) 解析しやすいよ, とか書いてある.

Notation

文法仕様の記述は EBNF だそうだ.

Source code representation

  • 文字コードは UTF-8 決め打ち
  • 大文字小文字は区別する
  • NUL 文字 (U+0000) は単に無視される

文字とか数字の定義

Lexical elements

Comments

コメントは java と同じ

Tokens

言語の構成物 (token) は, 識別子, キーワード, 演算子とデリミタ, リテラル

空白文字 (半角スペース, 水平タブ, CR, LF) は無視される

# 全角空白は空白文字とはされていないのか

改行やファイルの末尾には (次で定義する) セミコロンが挿入される

# Scala のようにセミコロンは省略可能, ということか

Semicolons

; が自動で挿入される条件

  1. 識別子
  2. 整数, 浮動小数点数, 虚数, ルーン, 文字列
  3. キーワード (break, continue, fallthrough, return)
  4. ++, --, ), ], }

の後

逆に )} まではセミコロンの挿入が回避される

# Scala と同じく () の中と {} の中の改行では挿入されないということか?

Identifiers

文字もしくは _ で始まり, 文字, _, 数字が続く

Keywords

break        default      func         interface    select
case         defer        go           map          struct
chan         else         goto         package      switch
const        fallthrough  if           range        type
continue     for          import       return       var

識別子には使えない

Operators and Delimiters

+    &     +=    &=     &&    ==    !=    (    )
-    |     -=    |=     ||    <     <=    [    ]
*    ^     *=    ^=     <-    >     >=    {    }
/    <<    /=    <<=    ++    =     :=    ,    ;
%    >>    %=    >>=    --    !     ...   .    :
     &^          &^=

Integer literals

0 始まりは 8 進数 0x 始まり, 0X 始まりは 16 進数

# Java と一緒

Floating-point literals

1.1 とか 13.4e-3 とか

Imaginary literals

複素数の虚数部分のみ

数値 (整数, 浮動小数点数) の後に i を付ける

Rune literals

色々な「文字」の表現 文字そのものとかコードポイントによる指定とか

' で囲われる

# rune って言葉は中二病っぽい

String literals

「文字」

" で囲われると, \ を使って特殊文字が入れられる ` で囲われると, 改行をそのまま書ける

Constants

(書きかけ)

Python で書く代数 - pyarith よ, 私は帰ってきた

1年ぶりの pyarith の記事です. 実は Python で書く代数 を書いてから, 追加した実装があるのでそれについて書きます.

書いてあること

  • pyarith のおさらい
  • 環について
  • 環の公理とテストケースの対応

おさらい

pyarith とは Python でどこまで代数的対象が表現できるかの実験ライブラリです. Python コードは読めるけど代数学のことは知らない人に, 代数的概念を説明することを目的としています. 今のところライブラリとしての実用性は目指していません. おそらくパフォーマンスも出ません.

前々回の記事 で「群」の解説をし, 前回の記事 で群であることを確かめるテストについて解説しました. このテストでは pytest というライブラリを使用し, パラメータ化されたテストを行いました.

この記事を書いたおかげで pytest に興味を持ってくれた人もいたようで, ちょっと嬉しいです.

前回扱ったのは「群」という概念でしたが, 今回は「環」を取り上げます.

群はある規則を満たす集合でした. 環は, 群にさらに満たすべき規則を追加した集合です.

群と環にどんな差分があるかは環を実装した Ring クラスの実装を見てみましょう. https://bitbucket.org/cocoatomo/pyarith/src/dfbb010c50390e5dece00b92558a5c3461199507/tests/test_ring.py ここから分かるのは「環は群に無い __mul__ というメソッドを持つ」ということです.

この Ring クラスと __mul__ というメソッドに課せられた制限はテストケースで表すのでした.

テストケースとその意味
test_mul_welldefined_right 右からの乗算が well-defined であること
test_mul_welldefined_left 左からの乗算が well-defined であること
test_ONE (乗法に関する) 単位元の存在
test_mul_ONE 単位元の性質
test_mul_associative_law 乗法の結合律

乗法は可換とは限らない演算なので, 可換性に関するテストはありません.

また加算と乗算が両方登場する性質を表すテストケースとして以下のものがあります.

テストケースとその意味 (2)
test_distributing_law 分配法則

小学生の頃に分配法則という言葉が出てきましたが, 当時はここまで重要な性質だとは思いませんでした.

環の公理一覧については http://ja.wikipedia.org/wiki/%E7%92%B0_(%E6%95%B0%E5%AD%A6) を参照してください.

Licenses