Обработка командной строки-args-left? - PullRequest
1 голос
/ 15 февраля 2010

У меня есть функция, в которой я передаю имя файла, за которым следуют несколько целочисленных параметров. Проблема в том, что теперь я хочу запустить свой код как сценарий Unix, используя command-line-args-left для передачи параметров из командной строки. Когда # 1 вызывает аргументы процесса, создается список со всеми значениями. В # 2 список из списка {например. ((1 2 3))} создается при входе в process-args. Каков наилучший способ сделать мой код универсальным, чтобы я мог обрабатывать оба случая # 1 и # 2 в одной и той же функции?

(defun process-args (filename &rest cols) ...) 
(process-args filename 1 2 3); <strong>#1</strong>
(process-args (car command-line-args-left) (cdr command-line-args-left)); <strong>#2</strong>

Вот пример рабочего кода, с которым я тестирую:

#!/usr/bin/emacs --script

(defun process-args (filename &rest cols)
           (princ (concat "Script Name: " file "\n"))
       (princ (concat "File parameter: " filename "\n"))
       (princ "Other arg values: ")
       (princ cols)
       (princ "\nIs list: ")
       (princ (listp cols))
       (princ "\n----------\n")
       (while cols
         (princ (car cols))
         (princ "...")
         (setq cols (cdr cols)))
       (princ "\n"))

(print "===== Version #1: Base case - becomes (1 2 3) =====")
(process-args (car command-line-args-left) 1 2 3)

(print "===== Version #2: Passing cdr of list as one string =====")
(process-args (car command-line-args-left) (mapconcat 'identity (cdr command-line-args-left) " "));

(print "===== Version #3: Test of list of list - becomes ((1 2 3)) =====")
(process-args (car command-line-args-left) '(1 2 3))

1 Ответ

0 голосов
/ 15 февраля 2010

Вы можете попробовать использовать 'apply, чтобы сгладить последний аргумент (последний аргумент для 'apply' is a list of arguments, use 'funcall`, если у вас нет последнего бита в списке).

Итак, версия # 3 выше будет обрабатываться так:

(apply 'process-args (car command-line-args-left) '(1 2 3))

(Другие вызовы не изменятся.)

...