doc comments: refer to specification of Skylark, not Bazel or Python (#26)

diff --git a/eval.go b/eval.go
index e7e1ebb..867feea 100644
--- a/eval.go
+++ b/eval.go
@@ -1865,7 +1865,7 @@
 	return len(is.large)
 }
 
-// See https://docs.python.org/2/library/stdtypes.html#string-formatting.
+// https://github.com/google/skylark/blob/master/doc/spec.md#string-interpolation
 func interpolate(format string, x Value) (Value, error) {
 	var buf bytes.Buffer
 	path := make([]Value, 0, 4)
diff --git a/library.go b/library.go
index fcd857c..f2cc77c 100644
--- a/library.go
+++ b/library.go
@@ -34,7 +34,7 @@
 var Universe StringDict
 
 func init() {
-	// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#XYZ
+	// https://github.com/google/skylark/blob/master/doc/spec.md#built-in-constants-and-functions
 	Universe = StringDict{
 		"None":      None,
 		"True":      True,
@@ -74,8 +74,8 @@
 type builtinMethod func(fnname string, recv Value, args Tuple, kwargs []Tuple) (Value, error)
 
 // methods of built-in types
+// https://github.com/google/skylark/blob/master/doc/spec.md#built-in-methods
 var (
-	// See https://bazel.build/versions/master/docs/skylark/lib/dict.html.
 	dictMethods = map[string]builtinMethod{
 		"clear":      dict_clear,
 		"get":        dict_get,
@@ -88,7 +88,6 @@
 		"values":     dict_values,
 	}
 
-	// See https://bazel.build/versions/master/docs/skylark/lib/list.html.
 	listMethods = map[string]builtinMethod{
 		"append": list_append,
 		"clear":  list_clear,
@@ -99,7 +98,6 @@
 		"remove": list_remove,
 	}
 
-	// See https://bazel.build/versions/master/docs/skylark/lib/string.html.
 	stringMethods = map[string]builtinMethod{
 		"bytes":            string_iterable,
 		"capitalize":       string_capitalize,
@@ -136,7 +134,6 @@
 		"upper":            string_upper,
 	}
 
-	// See https://bazel.build/versions/master/docs/skylark/lib/set.html.
 	setMethods = map[string]builtinMethod{
 		"union": set_union,
 	}
@@ -343,7 +340,7 @@
 
 // ---- builtin functions ----
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#all
+// https://github.com/google/skylark/blob/master/doc/spec.md#all
 func all(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	var iterable Iterable
 	if err := UnpackPositionalArgs("all", args, kwargs, 1, &iterable); err != nil {
@@ -360,7 +357,7 @@
 	return True, nil
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#any
+// https://github.com/google/skylark/blob/master/doc/spec.md#any
 func any(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	var iterable Iterable
 	if err := UnpackPositionalArgs("all", args, kwargs, 1, &iterable); err != nil {
@@ -377,7 +374,7 @@
 	return False, nil
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#bool
+// https://github.com/google/skylark/blob/master/doc/spec.md#bool
 func bool_(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	var x Value = False
 	if err := UnpackPositionalArgs("bool", args, kwargs, 0, &x); err != nil {
@@ -406,7 +403,7 @@
 	return String(string(i)), nil
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#cmp
+// https://github.com/google/skylark/blob/master/doc/spec.md#cmp
 func cmp(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	if len(kwargs) > 0 {
 		return nil, fmt.Errorf("cmp does not accept keyword arguments")
@@ -429,7 +426,7 @@
 	return zero, nil // x == y or one of the operands is NaN
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#dict
+// https://github.com/google/skylark/blob/master/doc/spec.md#dict
 func dict(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	if len(args) > 1 {
 		return nil, fmt.Errorf("dict: got %d arguments, want at most 1", len(args))
@@ -441,7 +438,7 @@
 	return dict, nil
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#dir
+// https://github.com/google/skylark/blob/master/doc/spec.md#dir
 func dir(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	if len(kwargs) > 0 {
 		return nil, fmt.Errorf("dir does not accept keyword arguments")
@@ -461,7 +458,7 @@
 	return NewList(elems), nil
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#enumerate
+// https://github.com/google/skylark/blob/master/doc/spec.md#enumerate
 func enumerate(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	var iterable Iterable
 	var start int
@@ -543,7 +540,7 @@
 	return args[0], nil
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#getattr
+// https://github.com/google/skylark/blob/master/doc/spec.md#getattr
 func getattr(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	var object, dflt Value
 	var name string
@@ -561,7 +558,7 @@
 	return nil, fmt.Errorf("%s has no .%s field or method", object.Type(), name)
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#hasattr
+// https://github.com/google/skylark/blob/master/doc/spec.md#hasattr
 func hasattr(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	var object Value
 	var name string
@@ -576,7 +573,7 @@
 	return False, nil
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#hash
+// https://github.com/google/skylark/blob/master/doc/spec.md#hash
 func hash(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	var x Value
 	if err := UnpackPositionalArgs("hash", args, kwargs, 1, &x); err != nil {
@@ -586,7 +583,7 @@
 	return MakeUint(uint(h)), err
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#int
+// https://github.com/google/skylark/blob/master/doc/spec.md#int
 func int_(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	var x Value = zero
 	var base Value
@@ -675,7 +672,7 @@
 	return i, nil
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#len
+// https://github.com/google/skylark/blob/master/doc/spec.md#len
 func len_(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	var x Value
 	if err := UnpackPositionalArgs("len", args, kwargs, 1, &x); err != nil {
@@ -688,7 +685,7 @@
 	return MakeInt(len), nil
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#list
+// https://github.com/google/skylark/blob/master/doc/spec.md#list
 func list(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	var iterable Iterable
 	if err := UnpackPositionalArgs("list", args, kwargs, 0, &iterable); err != nil {
@@ -709,7 +706,7 @@
 	return NewList(elems), nil
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#min
+// https://github.com/google/skylark/blob/master/doc/spec.md#min
 func minmax(thread *Thread, fn *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	if len(args) == 0 {
 		return nil, fmt.Errorf("%s requires at least one positional argument", fn.Name())
@@ -796,7 +793,7 @@
 	return MakeInt(int(r)), nil
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#print
+// https://github.com/google/skylark/blob/master/doc/spec.md#print
 func print(thread *Thread, fn *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	var buf bytes.Buffer
 	path := make([]Value, 0, 4)
@@ -830,7 +827,7 @@
 	return None, nil
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#range
+// https://github.com/google/skylark/blob/master/doc/spec.md#range
 func range_(thread *Thread, fn *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	var start, stop, step int
 	step = 1
@@ -866,7 +863,7 @@
 	return list, nil
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#repr
+// https://github.com/google/skylark/blob/master/doc/spec.md#repr
 func repr(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	var x Value
 	if err := UnpackPositionalArgs("repr", args, kwargs, 1, &x); err != nil {
@@ -875,7 +872,7 @@
 	return String(x.String()), nil
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#reversed.
+// https://github.com/google/skylark/blob/master/doc/spec.md#reversed
 func reversed(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	var iterable Iterable
 	if err := UnpackPositionalArgs("reversed", args, kwargs, 1, &iterable); err != nil {
@@ -898,7 +895,7 @@
 	return NewList(elems), nil
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#set
+// https://github.com/google/skylark/blob/master/doc/spec.md#set
 func set(thread *Thread, fn *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	var iterable Iterable
 	if err := UnpackPositionalArgs("set", args, kwargs, 0, &iterable); err != nil {
@@ -918,7 +915,7 @@
 	return set, nil
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#sorted
+// https://github.com/google/skylark/blob/master/doc/spec.md#sorted
 func sorted(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	var iterable Iterable
 	var cmp Callable
@@ -981,7 +978,7 @@
 	s.elems[i], s.elems[j] = s.elems[j], s.elems[i]
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#str
+// https://github.com/google/skylark/blob/master/doc/spec.md#str
 func str(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	if len(kwargs) > 0 {
 		return nil, fmt.Errorf("str does not accept keyword arguments")
@@ -996,7 +993,7 @@
 	return x, nil
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#tuple
+// https://github.com/google/skylark/blob/master/doc/spec.md#tuple
 func tuple(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	var iterable Iterable
 	if err := UnpackPositionalArgs("tuple", args, kwargs, 0, &iterable); err != nil {
@@ -1018,7 +1015,7 @@
 	return elems, nil
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#type
+// https://github.com/google/skylark/blob/master/doc/spec.md#type
 func type_(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	if len(kwargs) > 0 {
 		return nil, fmt.Errorf("type does not accept keyword arguments")
@@ -1029,7 +1026,7 @@
 	return String(args[0].Type()), nil
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/globals.html#zip
+// https://github.com/google/skylark/blob/master/doc/spec.md#zip
 func zip(thread *Thread, _ *Builtin, args Tuple, kwargs []Tuple) (Value, error) {
 	if len(kwargs) > 0 {
 		return nil, fmt.Errorf("zip does not accept keyword arguments")
@@ -1073,7 +1070,7 @@
 
 // ---- methods of built-in types ---
 
-// https://docs.python.org/2/library/stdtypes.html#dict.get
+// https://github.com/google/skylark/blob/master/doc/spec.md#dict·get
 func dict_get(fnname string, recv Value, args Tuple, kwargs []Tuple) (Value, error) {
 	var key, dflt Value
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 1, &key, &dflt); err != nil {
@@ -1089,7 +1086,7 @@
 	return None, nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#dict.clear
+// https://github.com/google/skylark/blob/master/doc/spec.md#dict·clear
 func dict_clear(fnname string, recv Value, args Tuple, kwargs []Tuple) (Value, error) {
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 0); err != nil {
 		return nil, err
@@ -1097,7 +1094,7 @@
 	return None, recv.(*Dict).Clear()
 }
 
-// https://docs.python.org/2/library/stdtypes.html#dict.items
+// https://github.com/google/skylark/blob/master/doc/spec.md#dict·items
 func dict_items(fnname string, recv Value, args Tuple, kwargs []Tuple) (Value, error) {
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 0); err != nil {
 		return nil, err
@@ -1110,7 +1107,7 @@
 	return NewList(res), nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#dict.keys
+// https://github.com/google/skylark/blob/master/doc/spec.md#dict·keys
 func dict_keys(fnname string, recv Value, args Tuple, kwargs []Tuple) (Value, error) {
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 0); err != nil {
 		return nil, err
@@ -1118,7 +1115,7 @@
 	return NewList(recv.(*Dict).Keys()), nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#dict.pop
+// https://github.com/google/skylark/blob/master/doc/spec.md#dict·pop
 func dict_pop(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	recv := recv_.(*Dict)
 	var k, d Value
@@ -1135,7 +1132,7 @@
 	return nil, fmt.Errorf("pop: missing key")
 }
 
-// https://docs.python.org/2/library/stdtypes.html#dict.popitem
+// https://github.com/google/skylark/blob/master/doc/spec.md#dict·popitem
 func dict_popitem(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 0); err != nil {
 		return nil, err
@@ -1152,7 +1149,7 @@
 	return Tuple{k, v}, nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#dict.setdefault
+// https://github.com/google/skylark/blob/master/doc/spec.md#dict·setdefault
 func dict_setdefault(fnname string, recv Value, args Tuple, kwargs []Tuple) (Value, error) {
 	var key, dflt Value = nil, None
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 1, &key, &dflt); err != nil {
@@ -1168,7 +1165,7 @@
 	}
 }
 
-// https://docs.python.org/2/library/stdtypes.html#dict.update
+// https://github.com/google/skylark/blob/master/doc/spec.md#dict·update
 func dict_update(fnname string, recv Value, args Tuple, kwargs []Tuple) (Value, error) {
 	if len(args) > 1 {
 		return nil, fmt.Errorf("update: got %d arguments, want at most 1", len(args))
@@ -1179,7 +1176,7 @@
 	return None, nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#dict.update
+// https://github.com/google/skylark/blob/master/doc/spec.md#dict·update
 func dict_values(fnname string, recv Value, args Tuple, kwargs []Tuple) (Value, error) {
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 0); err != nil {
 		return nil, err
@@ -1192,7 +1189,7 @@
 	return NewList(res), nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#list.append
+// https://github.com/google/skylark/blob/master/doc/spec.md#list·append
 func list_append(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	recv := recv_.(*List)
 	var object Value
@@ -1206,7 +1203,7 @@
 	return None, nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#list.clear
+// https://github.com/google/skylark/blob/master/doc/spec.md#list·clear
 func list_clear(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 0); err != nil {
 		return nil, err
@@ -1214,7 +1211,7 @@
 	return None, recv_.(*List).Clear()
 }
 
-// https://docs.python.org/2/library/stdtypes.html#list.extend
+// https://github.com/google/skylark/blob/master/doc/spec.md#list·extend
 func list_extend(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	recv := recv_.(*List)
 	var iterable Iterable
@@ -1228,7 +1225,7 @@
 	return None, nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#list.index
+// https://github.com/google/skylark/blob/master/doc/spec.md#list·index
 func list_index(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	recv := recv_.(*List)
 	var value, start_, end_ Value
@@ -1251,7 +1248,7 @@
 	return nil, fmt.Errorf("index: value not in list")
 }
 
-// https://docs.python.org/2/library/stdtypes.html#list.insert
+// https://github.com/google/skylark/blob/master/doc/spec.md#list·insert
 func list_insert(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	recv := recv_.(*List)
 	var index int
@@ -1281,7 +1278,7 @@
 	return None, nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#list.remove
+// https://github.com/google/skylark/blob/master/doc/spec.md#list·remove
 func list_remove(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	recv := recv_.(*List)
 	var value Value
@@ -1302,7 +1299,7 @@
 	return nil, fmt.Errorf("remove: element not found")
 }
 
-// https://docs.python.org/2/library/stdtypes.html#list.pop
+// https://github.com/google/skylark/blob/master/doc/spec.md#list·pop
 func list_pop(fnname string, recv Value, args Tuple, kwargs []Tuple) (Value, error) {
 	list := recv.(*List)
 	index := list.Len() - 1
@@ -1320,7 +1317,7 @@
 	return res, nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.capitalize
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·capitalize
 func string_capitalize(fnname string, recv Value, args Tuple, kwargs []Tuple) (Value, error) {
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 0); err != nil {
 		return nil, err
@@ -1344,7 +1341,7 @@
 	}, nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.count
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·count
 func string_count(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	recv := string(recv_.(String))
 
@@ -1366,7 +1363,7 @@
 	return MakeInt(strings.Count(slice, sub)), nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.endswith
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·endswith
 func string_endswith(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	recv := string(recv_.(String))
 	var suffix string
@@ -1376,7 +1373,7 @@
 	return Bool(strings.HasSuffix(recv, suffix)), nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.isalnum
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·isalnum
 func string_isalnum(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 0); err != nil {
 		return nil, err
@@ -1390,7 +1387,7 @@
 	return Bool(recv != ""), nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.isalpha
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·isalpha
 func string_isalpha(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 0); err != nil {
 		return nil, err
@@ -1404,7 +1401,7 @@
 	return Bool(recv != ""), nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.isdigit
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·isdigit
 func string_isdigit(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 0); err != nil {
 		return nil, err
@@ -1418,7 +1415,7 @@
 	return Bool(recv != ""), nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.islower
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·islower
 func string_islower(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 0); err != nil {
 		return nil, err
@@ -1437,7 +1434,7 @@
 	return false
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.isspace
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·isspace
 func string_isspace(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 0); err != nil {
 		return nil, err
@@ -1451,7 +1448,7 @@
 	return Bool(recv != ""), nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.istitle
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·istitle
 func string_istitle(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 0); err != nil {
 		return nil, err
@@ -1482,7 +1479,7 @@
 	return Bool(cased), nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.isupper
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·isupper
 func string_isupper(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 0); err != nil {
 		return nil, err
@@ -1491,12 +1488,12 @@
 	return Bool(isCasedString(recv) && recv == strings.ToUpper(recv)), nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.find
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·find
 func string_find(fnname string, recv Value, args Tuple, kwargs []Tuple) (Value, error) {
 	return string_find_impl(fnname, string(recv.(String)), args, kwargs, true, false)
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.format
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·format
 func string_format(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	format := string(recv_.(String))
 	var auto, manual bool // kinds of positional indexing used
@@ -1617,12 +1614,12 @@
 	return String(buf.String()), nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.index
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·index
 func string_index(fnname string, recv Value, args Tuple, kwargs []Tuple) (Value, error) {
 	return string_find_impl(fnname, string(recv.(String)), args, kwargs, false, false)
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.join
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·join
 func string_join(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	recv := string(recv_.(String))
 	var iterable Iterable
@@ -1646,7 +1643,7 @@
 	return String(buf.String()), nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.lower
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·lower
 func string_lower(fnname string, recv Value, args Tuple, kwargs []Tuple) (Value, error) {
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 0); err != nil {
 		return nil, err
@@ -1654,7 +1651,7 @@
 	return String(strings.ToLower(string(recv.(String)))), nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.lstrip
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·lstrip
 func string_lstrip(fnname string, recv Value, args Tuple, kwargs []Tuple) (Value, error) {
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 0); err != nil {
 		return nil, err
@@ -1662,7 +1659,7 @@
 	return String(strings.TrimLeftFunc(string(recv.(String)), unicode.IsSpace)), nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.partition
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·partition
 func string_partition(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	recv := string(recv_.(String))
 	var sep string
@@ -1691,7 +1688,7 @@
 	return tuple, nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.replace
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·replace
 func string_replace(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	recv := string(recv_.(String))
 	var old, new string
@@ -1702,17 +1699,17 @@
 	return String(strings.Replace(recv, old, new, count)), nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.rfind
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·rfind
 func string_rfind(fnname string, recv Value, args Tuple, kwargs []Tuple) (Value, error) {
 	return string_find_impl(fnname, string(recv.(String)), args, kwargs, true, true)
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.rindex
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·rindex
 func string_rindex(fnname string, recv Value, args Tuple, kwargs []Tuple) (Value, error) {
 	return string_find_impl(fnname, string(recv.(String)), args, kwargs, false, true)
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.rstrip
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·rstrip
 func string_rstrip(fnname string, recv Value, args Tuple, kwargs []Tuple) (Value, error) {
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 0); err != nil {
 		return nil, err
@@ -1720,7 +1717,7 @@
 	return String(strings.TrimRightFunc(string(recv.(String)), unicode.IsSpace)), nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.startswith
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·startswith
 func string_startswith(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	recv := string(recv_.(String))
 	var prefix string
@@ -1730,9 +1727,9 @@
 	return Bool(strings.HasPrefix(recv, prefix)), nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.strip
-// https://docs.python.org/2/library/stdtypes.html#str.lstrip
-// https://docs.python.org/2/library/stdtypes.html#str.rstrip
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·strip
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·lstrip
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·rstrip
 func string_strip(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	var chars string
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 0, &chars); err != nil {
@@ -1763,7 +1760,7 @@
 	return String(s), nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.title
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·title
 func string_title(fnname string, recv Value, args Tuple, kwargs []Tuple) (Value, error) {
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 0); err != nil {
 		return nil, err
@@ -1771,7 +1768,7 @@
 	return String(strings.Title(strings.ToLower(string(recv.(String))))), nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.upper
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·upper
 func string_upper(fnname string, recv Value, args Tuple, kwargs []Tuple) (Value, error) {
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 0); err != nil {
 		return nil, err
@@ -1779,8 +1776,8 @@
 	return String(strings.ToUpper(string(recv.(String)))), nil
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.split
-// https://docs.python.org/2/library/stdtypes.html#str.rsplit
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·split
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·rsplit
 func string_split(fnname string, recv_ Value, args Tuple, kwargs []Tuple) (Value, error) {
 	recv := string(recv_.(String))
 	var sep_ Value
@@ -1856,7 +1853,7 @@
 	return res
 }
 
-// https://docs.python.org/2/library/stdtypes.html#str.splitlines
+// https://github.com/google/skylark/blob/master/doc/spec.md#string·splitlines
 func string_splitlines(fnname string, recv Value, args Tuple, kwargs []Tuple) (Value, error) {
 	var keepends bool
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 0, &keepends); err != nil {
@@ -1880,7 +1877,7 @@
 	return NewList(list), nil
 }
 
-// See https://bazel.build/versions/master/docs/skylark/lib/set.html#union.
+// https://github.com/google/skylark/blob/master/doc/spec.md#set·union.
 func set_union(fnname string, recv Value, args Tuple, kwargs []Tuple) (Value, error) {
 	var iterable Iterable
 	if err := UnpackPositionalArgs(fnname, args, kwargs, 0, &iterable); err != nil {
diff --git a/syntax/parse.go b/syntax/parse.go
index 0ffb8b4..c824738 100644
--- a/syntax/parse.go
+++ b/syntax/parse.go
@@ -554,7 +554,7 @@
 // preclevels groups operators of equal precedence.
 // Comparisons are nonassociative; other binary operators associate to the left.
 // Unary MINUS and PLUS have higher precedence so are handled in parsePrimary.
-// See http://docs.python.org/2/reference/expressions.html#operator-precedence
+// See https://github.com/google/skylark/blob/master/doc/spec.md#binary-operators
 var preclevels = [...][]Token{
 	{OR},  // or
 	{AND}, // and
diff --git a/syntax/scan.go b/syntax/scan.go
index 516f865..7e8cb9a 100644
--- a/syntax/scan.go
+++ b/syntax/scan.go
@@ -717,11 +717,13 @@
 }
 
 func (sc *scanner) scanNumber(val *tokenValue, c rune) Token {
-	// https://docs.python.org/2/reference/lexical_analysis.html#integer-and-long-integer-literals
-	// Not supported:
+	// https://github.com/google/skylark/blob/master/doc/spec.md#lexical-elements
+	//
+	// Python features not supported:
 	// - integer literals of >64 bits of precision
 	// - 123L or 123l long suffix
 	// - traditional octal: 0755
+	// https://docs.python.org/2/reference/lexical_analysis.html#integer-and-long-integer-literals
 
 	fraction, exponent := false, false
 
diff --git a/value.go b/value.go
index 62724c7..d36b76f 100644
--- a/value.go
+++ b/value.go
@@ -93,8 +93,7 @@
 	// Skylark interpreters running concurrently.
 	Freeze()
 
-	// Truth returns the truth value of an object, according to Python rules.
-	// http://docs.python.org/2/library/stdtypes.html#truth-value-testing
+	// Truth returns the truth value of an object.
 	Truth() Bool
 
 	// Hash returns a function of x such that Equals(x, y) => Hash(x) == Hash(y).