elisp で resursive マクロを定義しようとしています
(defmacro remacro (keys)
(if keys
`(func1 ,(car keys)
,(remacro (cdr keys)))
))
(macroexpand '(remacro '(a b c)))
しかし、それはで終わります
Lisp nesting exceeds `max-lisp-eval-depth'
エラー。
のような結果を得たかった
(func1 a (func1 b (func1 c nil nil) '(c)) '(b c))
から
(remacro '(a b c))
この定義を修正する方法を教えてください。
もう1つ、次のように「キー」を残りのパラメーターとして定義できますか
(defmacro remacro (&rest keys)
(if keys
`(abc ,(car keys)
,(remacro `,@(cdr keys)))
))
これを試しましたが、うまくいきません。
使用事例:
基本的に私は関数を定義したかった
alist 方式で配置されたツリー ノードを設定する
(それはまだ機能していません、それに取り組む必要があります)
(defmacro set-tree-node (tree e &rest keys)
`(setcdr
,(if keys
`(assoc (car keys)
(pushnew
(list ,(car keys))
(cdr
,(set-tree-node `(cdr ,xtree) e `,@(cdr keys)))
:key 'car))
tree)
e))
(setq egtree nil)
走った後
(set-tree-node egtree new-node n b c)
取得する必要があります
egtree 式
((n (b (c . new-node))))
また
(n (b (c . new-node)))
私はそれを関数として定義しました
(defun set-tree-node (tree e &rest keys)
(setcdr
(reduce (lambda (xtree k)
(message "tree %s k %s" xtree k)
(assoc k (pushnew (list k) (cdr xtree) :key 'car)))
keys :initial-value (cons nil tree))
e))
ただし、既存のリストに対してのみ機能する可能性があります
正常に変更できます(フルパスが存在する場合はツリー)
egtree from
(setq egtree '((n (b (c . d)))))
に
egtree eq
'((n (b (c . replaced-d))))
このように呼び出された後
(set-tree-node jt 'replaced-d 'n 'b 'c)
ただし、完全なパスが存在しない場合、この関数は if リストでは機能しません