2017-10-08 18 views
0

再帰的に動作するマクロを作成しようとしています。 1つのノード(->)または2つの方向(<->)の2つのノード間にリンクを作成する必要があります。私はそれが...の問題だと信じて、それを動作させるように見えることはできません。再帰マクロ

作成した構造

(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

「エッジ」はマクロであってはならないと感じます。しかし、それはたいてい私のスパイシーな感覚です – 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) 
      ...)]))