在图形结构中使用引号
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=CAR
、children = CADDR
、parent = CADR
,就足够了。
你的错误是你使用了 '('node-b)
而不是 '(node-b)
。另外,
(cond
((null? data) #f)
(else (cdr data))))
可以写成(and data (cdr data))
我正在 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=CAR
、children = CADDR
、parent = CADR
,就足够了。
你的错误是你使用了 '('node-b)
而不是 '(node-b)
。另外,
(cond
((null? data) #f)
(else (cdr data))))
可以写成(and data (cdr data))