表是 Janet 中最灵活的数据结构之一,它模仿关联数组或字典而构建。值通过一个键放入到表中,之后可以用相同的键来查找这些值。表底层由开放哈希表实现,因此非常高效且缓存友好。
除了 nil 和 math/nan,任何 Janet 值都可以做为表的键或值,同一个表中可以有不同类型的键和值。
创建表
创建表最简单的方式是使用表字面量。
lisp
(def my-tab @{
:key1 1
"hello" "world!"
1 2
'(1 0) @{:another :table}})
另一个创建表的方式是通过 table 函数。它的优势是 table 是一个普通函数,可以像其他任何函数一样被传递。其他情况下,优先使用字面量。
lisp
(def my-tab (table
:key1 1
"hello" "world!"
1 2
'(1 0) @{:another :table}))
获取和设置值
和 Janet 中的其他数据结构一样,表中的值可以通过 get 函数获取,新值可以通过 put 或 set 函数添加。插入 nil 值会将键从表中删除。换句话说,表中不能包含 nil 值。
lisp
(def t @{})
(get t :key) #-> nil
(put t :key "hello")
(get t :key) #-> "hello")
(set (t :cheese) :cake)
(get t :cheese) #-> :cake
# Tables can be called as functions
# that look up the argument
(t :cheese) #-> :cake
Prototypes(原型)
所有表都可以有一个原型,它是一个父表(就像基类一样),当键在首表中不存在时就会检查父表。默认情况下表没有原型,它是一种灵活的机制,可以用来在 Janet 中实现继承。
用于表的函数
Janet 核心库中有很多用来操作表的函数。下面是一部分。
frequencieskeyskvslengthmerge-intomergepairspost-walkpre-walktable/getprototable/setprotoupdatevalueswalkzipcoll
文档参见 Table API。