/ / Как мога да картографирам неизвестен списък от аргументи за стартиране в elisp? - елисп

Как мога да начертая неизвестен списък с арги, за да стартирам процеса в елипса? - елип

Най-накрая се опитвам да науча elisp, но не съм обвила главата си как динамично да картографирам неизвестен списък от аргументи на променливи.

Ето една работеща функция, която предава до три аргумента за стартиране на процеса. Но бих искал да предам на функцията безкраен брой аргументи.

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

Как мога да постигна това и да направя кода си по-малко излишен? Всяка помощ с код или дори насочване към съответната документация оценявам.

Отговори:

3 за отговор № 1

Можеш да използваш apply:

(приложи FUNCTION & rest ARGUMENTS)

Обадете се на FUNCTION с останалите ни аргументи, като използвате последния аргумент като списък на аргументи. След това върнете стойността FUNCTION се връща. По този начин (приложите "+ 1 2" (3 4)) връща 10.

По този начин бихте могли да се обадите start-process използвайки нещо като:

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

Като странична бележка не трябва да създавате временни променливи, като използвате setq, тъй като това създава или променя глобални променливи (ако няма локални такива с името). Вместо това използвайте let.

Успех с вашите elisp проекти!