可以使用destructuring-bind定义destructuring-setq吗?

时间:2013-09-22 15:10:32

标签: macros lisp common-lisp destructuring

有destructuring-bind但似乎没有destructuring-setq。是否可以使用destructuring-bind定义它?

(let (a b c d)
  (destructuring-setq ((a b) (c d)) '((1 2) (3 4)))
  `(,b ,d))

(destructuring-bind
    ((a b) (c d)) '((1 2) (3 4))
  `(,b ,d))

1 个答案:

答案 0 :(得分:3)

这将是一项非常重要的努力。

你需要做的是写一个lambda-list analyzer

  1. 查找要绑定的所有变量
  2. 将其替换为gensym s(或使用copy-symbol以获取宏展开的完全不可读性:-)并保留旧符号到新符号的映射。
  3. 返回类似

    的内容
    (destructuring-bind (new-lambda-list)
         expression
       (setq old-var-1 new-gensym-1 ...))
    

    分析器存在于任何Common Lisp实现中(例如,参见上面的链接),它简单。

    我建议您问问自己destructuring-bind 是否还不够。