Как мне удалить каталог в common lisp

#directory #common-lisp

#каталог #common-lisp

Вопрос:

Чтобы удалить файл в Common Lisp, я могу сделать:

 (delete-file "c:\path\to\file")
 

Но по какой-то причине я не могу узнать, как удалить каталог. Нет delete-directory , и когда я передаю путь к каталогу delete-file , я получаю:

 couldn't delete c:pathtofolder: Unknown error
   [Condition of type SB-INT:SIMPLE-FILE-ERROR]
 

Поиск в Google тоже не помог.

Я использую Steel Banks Common Lisp в Windows, установленный с помощью Lispstick.

Ответ №1:

Uiop поставляется с ASDF 3 и имеет delete-empty-directory и delete-directory-tree .

Пожалуйста, используйте этот тип библиотеки-оболочки для удобства переносимости.

Ответ №2:

Google common lisp delete directory сразу предложил мне cl-fad. Я думаю, это может быть полезно (но я никогда не пробовал)

Комментарии:

1. Да, я видел это, но подумал, что такой огромный язык, как CL, должен иметь возможность удалять каталог без использования сторонней библиотеки 🙂

2. Это не обязательно. Понятия файла и каталога очень зависят от системы, и были еще более зависимыми в то время, когда Common Lisp был стандартизирован. Поэтому семантика выполнения таких действий была оставлена на усмотрение реализаций.

Ответ №3:

Я сам нашел решение. Я просмотрел исходный код cl-fad (упомянутый в других ответах) и увидел, что он в основном использует разные расширения для разных реализаций Common Lisp. Поскольку я использовал Steel Banks Common Lisp, мое решение было:

 (sb-ext:delete-directory "c:\path\to\folder\")
 

Для большинства других реализаций вам в основном нужно поменять sb-ext местами имя пакета расширения для рассматриваемой реализации.

Комментарии:

1. Не приведет ли это к потере совместимости, которую вы в противном случае получили бы cl-fad ?

2. Таким образом, вместо того, чтобы зависеть от библиотеки переносимости, теперь вы зависите от шага ручной замены для установки вашего программного обеспечения для разных реализаций CL. Это действительно победа?