2011-06-23 1 views
2

J'écris un programme Lisp commun qui doit gérer la sortie d'une commande. Cependant, lorsque j'essaie d'utiliser les résultats dans une autre fonction, je n'ai que NIL comme valeur de retour.Utilisation de stdout à partir d'un script shell en lisp commun

Voici la fonction que j'utilise pour exécuter des commandes:

(defun run-command (command &optional arguments) 
     (with-open-stream (pipe 
       (ext:run-program command :arguments arguments 
            :output :stream :wait nil)) 
     (loop 
       :for line = (read-line pipe nil nil) 
       :while line :collect line))) 

qui, lorsqu'il est exécuté par lui-même donne:

CL-USER> (run-command "ls" '("-l" "/tmp/test")) 
     ("-rw-r--r-- 1 petergil petergil 0 2011-06-23 22:02 /tmp/test") 

Cependant, quand je le lance à travers une fonction, seule nil est retournée :

(defun sh-ls (filename) 
     (run-command "ls" '("-l" filename))) 
CL-USER> (sh-ls "/tmp/test") 
     NIL 

Comment puis-je utiliser les résultats dans mes fonctions?

Répondre

7

Essayez ceci:

(defun sh-ls (filename) 
     (run-command "ls" (list "-l" filename))) 

Le « (nom de fichier "-l") cite la liste, et le symbole 'nom', plutôt que d'évaluer le nom de fichier.

+0

Cela fonctionne. Génial! – petergil

4

Vous pouvez également utiliser backquote `avant SEXPR et, avant le nom de fichier pour l'évaluer:

(defun sh-ls (filename) 
     (run-command "ls" `("-l" ,filename))) 
Questions connexes