0

defuncreate in a lisp マクロの let バインディングを条件付きで削除するにはどうすればよいですか? ここで、結果の関数から最初の let バインド変数を削除したいのですがnil、let バインドに固執してエラーが発生するという問題が発生しています。

たとえば、結果の関数はletorlet*を使用し、 に応じて最初の変数割り当てを削除する必要がありますarg。しかし、私が問題を書いた方法は、に置き換えることから来てvar1nilます。nil を取り除く方法がわかりません。

(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 に答える