0

如何有条件地删除defun在 lisp 宏中创建的 let 绑定?在这里,我想从结果函数中删除第一个 let-bound 变量,但是遇到了一个问题,即我有一个nil在 let 绑定中存在的问题,从而导致错误。

例如,生成的函数使用letorlet*并且应该删除第一个变量赋值,具体取决于arg. 但是我写问题的方式来自替换var1nil. 我不知道如何摆脱零。

(cl-defmacro mac (cmd &optional arg)
  (let ((fn (intern (concat "fn-" cmd))))
    `(defun ,fn ()
       (interactive)
       (,(if arg 'let* 'let)
        (cons
         ,(when arg
            '(var1 1))
         (var2 (if (bound-and-true-p var1) (+ var1 1) 1)))
        (message "%s" var2)))))

(mac "fun")    ; Attempt to set constant: nil
(mac "fun2" t) ; no problem
;; (symbol-function 'fn-fun)
;; (symbol-function 'fn-fun2)
;; (fn-fun)
;; (fn-fun2)
4

1 回答 1

1

最简单的解决方法可能是使用,@(when arg '((var1 1))). ,@用于将列表拼接到该位置。由于如果条件失败则WHEN返回,并且与空列表相同,因此拼接实际上忽略了它。当条件成功时返回,并由拼接解包。NILNIL((var1 1))(var1 1)

于 2016-07-25T06:44:15.170 回答