/ / Como posso mapear uma lista desconhecida de argumentos para iniciar o processo no elisp? - elisp

Como posso mapear uma lista desconhecida de argumentos para iniciar o processo no elisp? - elisp

Finalmente, estou tentando aprender elisp, mas ainda não entendi como mapear dinamicamente uma lista desconhecida de argumentos.

Aqui está uma função funcional que passa até três argumentos para iniciar o processo. Mas eu gostaria de passar um número infinito de argumentos para a função.

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

Aqui está um exemplo de uma função de chamada que eu gostaria de trabalhar com create-drush-buffer.

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

Como conseguir isso e tornar meu código menos redundante? Qualquer ajuda com o código ou mesmo me direcionando para a documentação relevante é apreciada.

Respostas:

3 para resposta № 1

Você pode usar apply:

(aplique FUNÇÃO e descanse ARGUMENTOS)

Chame FUNCTION com nossos argumentos restantes, usando nosso último argumento como lista de args. Em seguida, retorne o valor que FUNCTION retorna. Assim, (aplique "+ 1 2" (3 4)) retorna 10.

Dessa forma, você poderia ligar start-process usando algo como:

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

Como observação, você não deve criar variáveis ​​temporárias usando setq, pois isso cria ou modifica variáveis ​​globais (se não existirem locais com o nome). Em vez disso, use let.

Boa sorte com seus projetos elisp!