2017-10-08 51 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) 
      ...)]))