1

process-lines経由で Emacs からbash プログラムherbstclientを呼び出そうとしています。関数 hc によって呼び出される herbstclient を実際に呼び出すマクロ hc-call を作成しました。関数 hc は、stringify-numbers を介して数値引数を文字列に変換することになっています。

言うまでもなく、それは機能していません。「keybind」「Mod4-Shift-r」「reload」で hc を呼び出すと、次のエラーが発生します。

 *** Eval error ***  Wrong type argument: listp, stringified-args

hc で edebug を使用してみましたが、出力は stringify-numbers が適切に機能していることを示しています。関数は hc 呼び出しですぐにエラーになりました。それでも、実行すると:

(hc-call ("keybind" "Mod4-Shift-r" "reload"))

期待どおりに動作します。次に試しました:

(setq sargs (list "keybind" "Mod4-Shift-r" "reload"))
(hc-call sargs)

同じエラーが発生しました。これをさらにデバッグする方法がわかりません。以下はすべてのコードです。

(defmacro hc-call (args)
  "Call herbstclient to with the given arguments."
   `(process-lines "herbstclient" ,@args))

(defun stringify-numbers (args)
  "Take a list of random arguments with a mix of numbers and
  strings and convert just the numbers to strings."
  (let (stringified-args)
    (dolist (arg args)
      (if (numberp arg)
          (setq stringified-args (cons (number-to-string arg) stringified-args))
        (setq stringified-args (cons arg stringified-args))))
    (nreverse stringified-args)))

(defun hc (&rest args)
  "Pass arguments to herbstclient in a bash process."
  (let ((stringified-args (stringify-numbers args)))
    (hc-call stringified-args)))

stringified-args がリストではないと不平を言うのはなぜですか?

4

2 に答える 2

2

あなたhc-callは次のように関数でなければなりません

(defun hc-call (args)
  "Call herbstclient to with the given arguments."
  (apply #'process-lines "herbstclient" args))

ところで、私がここにいる間:

  (if (numberp arg)
      (setq stringified-args (cons (number-to-string arg) stringified-args))
    (setq stringified-args (cons arg stringified-args))))

よりよく書かれています

  (setq stringified-args (cons (if (numberp arg) (number-to-string arg) arg) stringified-args))))

また

  (push (if (numberp arg) (number-to-string arg) arg) stringified-args)))
于 2012-12-19T04:52:35.037 に答える
1

ほとんどの式とは異なり、マクロ引数は未評価で渡されます

これが(hc-call ("keybind" "Mod4-Shift-r" "reload"))エラーにならない理由です!

したがって、シンボルが評価されるリストではなく、マクロに(hc-call sargs)シンボルを渡すことになります。sargs

マクロで変数をこのように処理する場合は、に変更,@argsするか、実際の結果に応じて、,@(eval args)条件付きでいずれかの方法で処理することができます。args

于 2012-12-19T03:47:31.443 に答える