递归宏
问题描述:
我试图创建一个可以递归操作的宏。它需要在一个(->
)或两个(<->
)方向上的两个节点之间创建链接。我相信这是...
的问题,似乎无法使其正常工作。递归宏
创建的结构
(define-struct node (name edges) #:transparent)
希望的实施例的输入和输出
> (edges node1 <-> node2 -> node3)
> node1
> (node 'node1 '(node2))
> node2
> (node 'node2 '(node1 node3))
> node3
> (node 'node3 '())
电流输入和输出
> (edges node1 -> node2 node3)
> node1
> (node 'node1 '(node2 node3))
代码
(define-syntax edge
(syntax-rules()
[(edge node-name1 node-name2)
(begin (set! node-name1 (make-node (quote node-name1) (add-unique (node-name node-name2) (node-edges node-name1)))))]))
(define-syntax edges
(syntax-rules (-> <->)
[(edges node-name1 -> node-name2 ...)
(begin (edge node-name1 node-name2 ...))]
[(edges node-name1 <-> node-name2 ...)
(begin (edge node-name1 node-name2) ...
(edge node-name2 node-name1)
...)]))
节点被前面所定义。
答
这有帮助吗?
(define-syntax edges
(syntax-rules (-> <->)
[(edges _)
(begin)]
[(edges node-name1 -> node-name2 ...)
(begin (edge node-name1 (edges node-name2 ...)))]
[(edges node-name1 <-> node-name2 ...)
(begin (edge node-name1 node-name2) ...
(edge node-name2 node-name1)
...)]))
我觉得'边缘'不应该是一个宏,在这种情况下,但主要是我的spidey感言 – naomik