2017-10-08 88 views
0

我试图创建一个可以递归操作的宏。它需要在一个(->)或两个(<->)方向上的两个节点之间创建链接。我相信这是...的问题,似乎无法使其正常工作。递归宏

创建的结构

(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) 
      ...)])) 

节点被前面所定义。

+1

我觉得'边缘'不应该是一个宏,在这种情况下,但主要是我的spidey感言 – naomik

回答

0

这有帮助吗?

(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) 
      ...)]))