2010-08-13 4 views
7

J'apprends le CL et j'ai peu d'expérience dans d'autres langues. Quelqu'un pourrait-il me expliquer en termes simples ce que cela signifie, en particulier ce que « out » représente ici, et comment tout cela se comporte:explication avec fichier ouvert en termes simples

(defun save-db (filename) 
    (with-open-file (out filename 
        :direction :output 
        :if-exists :supersede) 
    (with-standard-io-syntax 
     (print *db* out)))) 

La plupart du temps, le bit Je ne comprends pas est « out », mais un explication de l'ensemble serait bien.

Merci

Répondre

5

out est la variable de flux lié au fichier ouvert. Avec avec-open-fichier garantit que le fichier est ouvert à l'intérieur de la portée, et fermé en dehors de la portée, peu importe la façon dont vous quittez.

+0

Comment puis-je obtenir des pages de manuel décrivant de telles choses sur Linux pour CL s'il vous plaît? – agd

+2

Les pages de manuel sont une tradition Unix, et Lisp provient d'une culture très distincte. En général, je google "hyperspec" + (quel que soit le terme que je suis curieux). – Ken

+1

Ou, dans de nombreux cas, vous pouvez utiliser le système de documentation intégré de Lisp: '(documentation 'foo' function)' recherchera la documentation de la fonction ou de la macro 'foo'. Malheureusement, cela semble manquer dans SBCL pour le cas spécifique de 'with-open-file'. –

1

En complément ddyer, vous pouvez également utiliser MACROEXPAND ou MACROEXPAND-1 pour voir ce WITH-OPEN-FILE fait:

(macroexpand '(with-open-file (out filename 
           :direction :output 
           :if-exists :supersede) 
       (with-standard-io-syntax 
       (print *db* out)))) 

nous dit

(LET ((OUT (OPEN FILENAME :DIRECTION :OUTPUT :IF-EXISTS :SUPERSEDE)) (#:G748 T)) 
    (UNWIND-PROTECT 
     (MULTIPLE-VALUE-PROG1 (PROGN (WITH-STANDARD-IO-SYNTAX (PRINT *DB* OUT))) 
     (SETQ #:G748 NIL)) 
    (WHEN OUT (CLOSE OUT :ABORT #:G748)))) 

Nous pouvons voir que nous ouvrons le fichier appelé filename et Affectez ce flux de fichier ouvert à out et faites quelque chose. Si quelque chose de mal se produit, UNWIND-PROTECTCLOSE le flux, devrait-il être non nil.

La variable #:G748 est un symbole ed GENSYM (c'est donc un symbole frais, non animé). Si rien ne se passe en écrivant le fichier, nous avons défini #:G748 à nil.

Ainsi, lorsque nous CLOSE le courant, si quelque chose a mal tourné #:G748 sera T, donc CLOSE va tenter de nettoyer les effets secondaires d'avoir créé le flux.

Questions connexes