/ / Jak mogę zmapować nieznaną listę argumentów, aby rozpocząć proces w elisp? - elisp

Jak mogę odwzorować nieznaną listę argumentów, aby rozpocząć proces w elicie? - elisp

W końcu próbuję nauczyć się elisp, ale nie owinąłem głowy wokół tego, jak dynamicznie mapować nieznaną listę argumentów na zmienne.

Oto działająca funkcja, która przekazuje do trzech argumentów procesowi startowemu, ale chciałbym przekazać nieskończoną liczbę argumentów funkcji.

(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"))))

Oto przykład funkcji wywołującej, którą chciałbym pracować z buforem create-drush.

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

Jak mogę to osiągnąć i uczynić mój kod mniej zbędnym? Doceniam wszelką pomoc przy kodowaniu, a nawet kierowanie mnie do odpowiedniej dokumentacji.

Odpowiedzi:

3 dla odpowiedzi № 1

Możesz użyć apply:

(zastosuj FUNKCJĘ i odpocznij ARGUMENTY)

Wywołaj FUNCTION z naszymi pozostałymi argumentami, używając naszej ostatniej arg jako listy args. Następnie zwróć wartość zwracaną przez FUNCTION. Zatem (zastosuj „+ 1 2” (3 4)) zwroty 10.

W ten sposób możesz zadzwonić start-process używając czegoś takiego jak:

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

Na marginesie nie należy tworzyć zmiennych tymczasowych za pomocą setq, ponieważ tworzy lub modyfikuje zmienne globalne (jeśli nie istnieją lokalne zmienne o nazwie). Zamiast tego użyj let.

Powodzenia w twoich elisp projektach!