2010-09-17 9 views

risposta

2

Penso che ci siano diversi modi. probe-file seguito controllando il vero nome restituito per determinare che ha un nome di directory ma non un nome di file e il tipo dovrebbe farlo. per esempio. per una directory

(pathname-name (probe-file filespec)) 

-> NIL 
+0

Mentre provavo la tua soluzione, dovevo rendermi conto che questo codice avrebbe generato un errore nel caso in cui non ci fossero file o directory 'filespec'. Suggerirei di usare un 'e' per meno codice soggetto a errori:' (e (probe-file filespec) (non (nome-percorso (probe-file filespec)))) ' – Sim

+1

Che non funzionerà. Non è chiaro che 'PROBE-FILE' funzioni sulle directory. Non è nemmeno chiaro che 'nome-percorso 'restituisca' NIL' per le directory. Generalmente questa funzionalità non è realmente fornita da Common Lisp e la maggior parte delle implementazioni ha una funzione per questo. Le biblioteche forniscono nomi portatili ... –

0

CLISP ha una funzione EXT:PROBE-DIRECTORY, che ti dice se esiste un file ed è una directory.

Si noti che questa funzione è specifica per CLISP e non standard di elenco comune.

+0

Sono spiacente ma GNU Common Lisp e GNU CLISP sono uguali? Sto usando GNU Common Lisp (GCL 2.6.6 su Windows) ma non ho trovato il suddetto pacchetto "ext". –

+0

@hyper: No, GCL e CLISP sono due diverse implementazioni del linguaggio Common Lisp. Dato che hai taggato questo 'clisp', ho pensato che stavi usando quest'ultimo. – sepp2k

+0

Rimosso il tag clisp. Grazie! –

1

CL-FAD ha una funzione DIRECTORY-EXISTS-P che, se usato in combinazione con PATHNAME-AS-DIRECTORY canonicalizes il percorso (impedisce fallimento quando ha consegnato una stringa come "/ percorso/dir-senza-trailing-slash") e achives quello che stai chiedendo.

(CL-FAD: DIRECTORY-PATHNAME-P (CL-FAD: PATHNAME-AS-DIRECTORY (PROBE-FILE "/ percorso/missing-slash")))

+0

Non sembra che funzioni con GCL. Almeno GCL non è elencato sotto "Implementazioni Lisp supportate" – sepp2k

+0

Suppongo che la buona notizia sia che, poiché GCL non ha avuto un rilascio in oltre mezzo decennio, se capisci come farlo, probabilmente non dovrai preoccupati di cambiarti presto! – Ken

+0

Ho controllato il codice sorgente di CL-FAD - la suddetta funzione funziona solo per Allegro e LispWorks. –

4

Leggere il capitolo di un portable pathname library da Il libro Practical Common Lisp di Peter Seibel. È disponibile gratuitamente. Ha una funzione file-exists-p che restituirà un percorso quando il file esiste o zero se non lo fa. Il percorso restituito sarà in forma di directory se si tratta di una directory. Dà anche un'altra funzione per verificare se il percorso è effettivamente in forma di directory.

BTW tutto il libro è davvero la pena di leggere in modo da controllarlo fuori se non l'hai già.

+2

La libreria CL-FAD * è * il capitolo di Peter Seibel, impacchettato per uso generale. La funzione DIRECTORY-EXISTS-P fa esattamente ciò che descrivi. – Ken

+0

Non lo sapevo. Grazie per le informazioni. – jondro

Problemi correlati