2

私は最終的にelispを学ぼうとしていますが、引数の未知のリストを変数に動的にマップする方法に頭を悩ませていません。

これは、start-process に最大 3 つの引数を渡す機能関数です。しかし、関数に無限の数の引数を渡したいと思います。

(defun create-drush-buffer (command &rest a)
  (if (locate-dominating-file default-directory "includes/bootstrap.inc")
      (progn
        (setq opt1 (car a))
        (setq opt2 (cadr a))
        (setq opt3 (caddr a))
        (setq allopt (concat opt1 " " opt2 " " opt3))
        (setq b-name (concat "*drush " command " " allopt "*"))
        (if (buffer-live-p b-name)
            (switch-to-buffer b-name)
          (setq d-buffer (get-buffer-create  b-name))
          (with-current-buffer d-buffer
            (goto-char (point-min))
            (view-mode 1)
            (hl-line-mode 1)
            (if opt3
                (start-process "drush" (current-buffer) drupal-drush-program
                               command
                               opt1
                               opt2
                               opt3)
              (if opt2
                  (start-process "drush" (current-buffer)
                                 drupal-drush-program
                                 command
                                 opt1
                                 opt2)
                (if opt1
                    (start-process "drush" (current-buffer)
                                   drupal-drush-program
                                   command
                                   opt1)
                  (start-process "drush" (current-buffer)
                                 drupal-drush-program
                                 command))))
            (shrink-window-if-larger-than-buffer))
          (switch-to-buffer d-buffer)))
    (message (concat default-directory " is not a drupal project"))))

create-drush-buffer で使用したい呼び出し関数の例を次に示します。

(defun drush-sql-sync ()
  (interactive)
  (create-drush-buffer
   "sql-sync"
   "-y"
   "-d"
   "-v"
   "@cu.wstage1-education"
  "@cu.local-education"))

これを達成し、コードの冗長性を減らすにはどうすればよいですか? コードに関するヘルプや、関連するドキュメントに私を誘導することさえできれば幸いです。

4

1 に答える 1

4

使用できますapply

(FUNCTION &rest ARGUMENTS を適用)

最後の引数を引数のリストとして使用して、残りの引数で FUNCTION を呼び出します。次に、FUNCTION が返す値を返します。したがって、(apply '+ 1 2 '(3 4)) は 10 を返します。

start-processこのようにして、次のようなものを使用して呼び出すことができます。

(apply 'start-process "drush" (current-buffer)
                             drupal-drush-program
                             command
                             a)

補足として、 を使用して一時変数を作成しないでください。setqグローバル変数が作成または変更されるためです (その名前のローカル変数が存在しない場合)。代わりに、を使用してletください。

elisp プロジェクトで頑張ってください!

于 2013-09-28T18:43:24.347 に答える