尝试在elisp中定义返回宏
(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))请告诉我如何才能纠正这个定义。
还有一件事,我可以将‘`keys’定义为rest参数,比如
(defmacro remacro (&rest keys)
(if keys
`(abc ,(car keys)
,(remacro `,@(cdr keys)))
))我试过这个,但它不起作用。
使用案例:
基本上我想定义一个函数
设置以列表方式排列的树节点
(它仍然不起作用,必须对其进行改进)
(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 eq
((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 list
发布于 2013-05-13 02:38:41
将宏写成:
(defmacro remacro (keys)
(if keys
`(abc ,(car keys)
(remacro ,(cdr keys)))))并将其称为:
(remacro (a b c))您不需要引用参数,因为宏参数不会求值。
要查看扩展,请使用:
(macroexpand-all '(remacro (a b c)))
(abc a (abc b (abc c nil)))我不明白在你的例子中add应该来自哪里,我假设这是一个abc的拼写错误。
发布于 2013-05-31 03:51:34
(defmacro tree-node (tree &rest keys)
(if keys
`(cdr
(assoc ',(car (last keys))
(pushnew
',(last keys)
(tree-node ,tree ,@(butlast keys))
:key 'car)))
tree))
(setq egtree nil)
(setf (tree-node egtree l1 l2 lx) 'value)
(push (tree-node egtree l1 l2 ly) 'element1)
(push (tree-node egtree l1 l2 ly) 'element2)
(defmacro set-tree-node (tree value &rest keys)
`(setf (tree-node ,tree ,@keys) ,value))
(set-tree-node egtree 'value l1 l2 lz)想做这样的宏。
https://stackoverflow.com/questions/16510603
复制相似问题