学习笔记

Jsonnet

Jsonnet 是模版语言,是 Json 的简单拓展。例子
主要用来为大型复杂的服务,跟编程一样,管理所有的配置。

Jsonnet 语言

Jsonnet 是一种完整的纯函数式编程语言。(跟命令式语言的最大区别是,定义东西是什么,而不是能做什么)。

Jsonnet 有7种类型的值。

function 例子
local func = function(x) x * 2;
local func(x) = x * 2; # 同上
func(21)
local foo(x, y=1) = x + y; # 带默认参数
[
  foo(1),
  foo(1, 1),
  foo(x=1, y=1),
  foo(y=1, x=1),
  foo(x=1),
]
Array 例子
local arr = [error "a", 2+2, error "b"];
arr[1];
# output: 4, 没有使用不会报错,函数式语言是懒加载的
[x * x for x in std.range(1, 3)];
# output: [1, 4, 9]
[x for x in std.range(1, 10) if x % 3 == 0]; 
# output: [3, 6, 9]
[
  [x, y]
  for x in std.range(1, 2)
  for y in std.range(x, 2)
]
# output: [[1,1], [1,2], [2,2]]
[
  x
  for y in std.range(1, 2)
  for x in std.range(1, 2)
]
# output: [1, 2, 1, 2]
[
  x
  for y in std.range(1, 2)
  for x in std.range(1, 2)
]
# output: [1, 1, 2, 2]
[
    [x, y]
    for x in std.range(1, 10)
    if x % 3 == 0
    for y in std.range(1, 10),
    if y % 2 == 0
]
Object 例子
local obj = {
  "foo": 1,
  "bar": {
    "arr": [1, 2, 3],
    "number": 10 + 7,
  }
};
[
  obj.foo,
  obj["foo"],
  obj["f" + "oo"]
]
# output: [1, 1, 1]
local obj = {
  name: "Alice",
  greeting: "Hello, " + self.name,
};
[
  obj,
  obj + { name: "Bob" },
  obj + { greeting: super.greeting + "!"},
  obj + { name: "Bob", greeting: super.greeting + "!"},
]
# output:
# [
#  {"greeting": "Hello, Alice", "name": "Alice"},
#  {"greeting": "Hello, Bob", "name": "Bob"},
#  {"greeting": "Hello, Alice!","name": "Alice"},
#  {"greeting": "Hello, Bob!","name": "Bob"}
# ]
继承的例子
local add = {
  params: {
    a: error "please provide argument a",
    b: error "please provide argument b",
  },
  result: self.params.a + self.params.b
};
(add + { params: { a: 1, b: 2} }).result
# output: 3
引用自身
local obj = {
  name: "Alice",
  greeting: "Hello, " + obj.name,
}; obj
# output: {"greeting": "Hello, Alice","name": "Alice"}

可见性

Show
{
  default: "foo",
  default_then_hidden: "foo",
  hidden:: "foo",
  hidden_then_default:: "foo",
  hidden_then_visible:: "foo",
  visible::: "foo",
  visible_then_hidden::: "foo",
}
+
{
  default_then_hidden:: "foo",
  hidden_then_default: "foo",
  hidden_then_visible::: "foo",
  visible_then_hidden:: "foo",
}
Output:
{
  "default": "foo",
  "hidden_then_visible": "foo",
  "visible": "foo"
}

字段继承

标准库