【Janet】Table

表是 Janet 中最灵活的数据结构之一,它模仿关联数组或字典而构建。值通过一个键放入到表中,之后可以用相同的键来查找这些值。表底层由开放哈希表实现,因此非常高效且缓存友好。

除了 nilmath/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 函数获取,新值可以通过 putset 函数添加。插入 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 核心库中有很多用来操作表的函数。下面是一部分。

  • frequencies
  • keys
  • kvs
  • length
  • merge-into
  • merge
  • pairs
  • post-walk
  • pre-walk
  • table/getproto
  • table/setproto
  • update
  • values
  • walk
  • zipcoll

文档参见 Table API

相关推荐
cheniie13 天前
【Janet】数据结构
数据结构·janet
cheniie22 天前
【Janet】特殊表达式
janet