在图形结构中使用引号

Using quoted symbols in a graph structure

我正在 Scheme 中构建图形结构。该图是双向的,更重要的是,节点的创建没有固定顺序。我使用以下代码创建节点:

(define (make-node data parents children)
    `((data . ,data) 
      (parents . ,parents)
      (children . ,children)))

如您所见,我对节点使用关联列表。我的 getter 似乎工作正常,这里以 data 的 getter 为例:

(define (node-data node)
    (let ((data (assq 'data node)))
        (cond
            ((null? data) #f)
            (else (cdr data)))))

但是,我无法遍历图形并使用相邻节点。这是我如何创建节点的示例:

(define (node-a (make-node "a" '() '('node-b)))

要从 node-a 访问 node-b,我

(car (node-children node-a))

但它 returns (quote node-b) 而不是 node-b.

我的问题是,此时我可以取消引用吗?怎么做?

我已经用其他语言编写了相同的算法,不管它值多少钱。我不得不为所有节点使用单独的映射容器。我也可以在 Scheme 中做到这一点,但是由于 Scheme 支持引用,我希望我可以在 Scheme 中使它更漂亮。

您对节点的表示似乎是连贯的,但是您可以找到更简单的表示。 ((DATA) (PARENTS) (CHILDREN)) 作为构造函数和吸气剂更直接 data=CARchildren = CADDRparent = CADR,就足够了。

你的错误是你使用了 '('node-b) 而不是 '(node-b)。另外,

(cond
 ((null? data) #f)
 (else (cdr data))))

可以写成(and data (cdr data))