Common lisp 显示当前目录内容的可移植方式

Common lisp 显示当前目录内容的可移植方式,common-lisp,Common Lisp,我想在重新启动案例期间向用户提供有关丢失输入文件的附加信息 是否有一种可移植的方法来打印当前目录中的文件?请查看,特别是在 例如: 使用(目录“~/*”)获取您家中的文件列表 使用(目录“~/*/”获取您家中的目录列表 和(目录“~/***”)以获取您家中所有子目录中所有文件的列表 请注意,目录可以采用特定于实现的参数,如:full 如果您正在使用(您应该!),您可能想看看它附带了哪些功能 注:如果您的实现不支持路径名中的~来引用主目录,您可以改为使用。请查看,特别是在 例如: 使用(目录

我想在
重新启动案例
期间向用户提供有关丢失输入文件的附加信息

是否有一种可移植的方法来打印当前目录中的文件?

请查看,特别是在

例如:

  • 使用
    (目录“~/*”)
    获取您家中的文件列表
  • 使用
    (目录“~/*/”
    获取您家中的目录列表
  • (目录“~/***”)
    以获取您家中所有子目录中所有文件的列表
请注意,
目录
可以采用特定于实现的参数,如
:full

如果您正在使用(您应该!),您可能想看看它附带了哪些功能

注:如果您的实现不支持路径名中的
~
来引用主目录,您可以改为使用。

请查看,特别是在

例如:

  • 使用
    (目录“~/*”)
    获取您家中的文件列表
  • 使用
    (目录“~/*/”
    获取您家中的目录列表
  • (目录“~/***”)
    以获取您家中所有子目录中所有文件的列表
请注意,
目录
可以采用特定于实现的参数,如
:full

如果您正在使用(您应该!),您可能想看看它附带了哪些功能


注:如果您的实现不支持路径名中的
~
来引用主目录,您可以改为使用。

对uiop的引用是我需要的提示。这就是我现在在测试用例中使用的内容,对我来说非常有效:

 (defun file-is-missing ()
  (let* ((cwd (uiop:getcwd))
         (files (uiop:directory-files cwd)))
    (format t "~&Current directory: ~a~%" cwd)
    (dolist (file files)
      (format t "~&~3T~a" file))
    (format t "~&Provide new file: ")
    (list (read-line))))

(defun read-file (file)
  (restart-case
      (with-open-file (s file :direction :input :if-does-not-exist :error)
        (do ((l (read-line s) (read-line s nil 'eof)))
            ((eq l 'eof) "Reached end of file.")
          (format t "~&*** ~A~%" l)))
    (New-File (filename)
      :interactive file-is-missing
      (read-file filename))))

对uiop的引用是我需要的提示。这就是我现在在测试用例中使用的内容,对我来说非常有效:

 (defun file-is-missing ()
  (let* ((cwd (uiop:getcwd))
         (files (uiop:directory-files cwd)))
    (format t "~&Current directory: ~a~%" cwd)
    (dolist (file files)
      (format t "~&~3T~a" file))
    (format t "~&Provide new file: ")
    (list (read-line))))

(defun read-file (file)
  (restart-case
      (with-open-file (s file :direction :input :if-does-not-exist :error)
        (do ((l (read-line s) (read-line s nil 'eof)))
            ((eq l 'eof) "Reached end of file.")
          (format t "~&*** ~A~%" l)))
    (New-File (filename)
      :interactive file-is-missing
      (read-file filename))))

Uiop(包含在ASDF中)具有可移植的文件系统/操作系统实用程序<代码>(uiop/filesystem:directory files(uiop/os:getcwd))。uiop(包含在ASDF中)具有可移植的文件系统/os实用程序
(uiop/filesystem:directory files(uiop/os:getcwd))
。提示输入新文件时,应使用
*QUERY-IO*
(在
读取行中及其前面的
格式中)。这样开发环境(比如SLIME/SLY)就可以理解这是一个提示。您还应该在它们之间放置一个
(FINISH-OUTPUT*QUERY-IO*)
,以确保在尝试读取任何内容之前打印提示。通常您不会递归调用read file,但是,在重新启动案例表单周围使用循环。@RainerJoswig能否请您提供一些背景信息,说明为什么要在这里避免递归?如果没有TCO,在多次调用重新启动的情况下,堆栈上会有多次调用READ-FILE…提示输入新文件时,您应该使用
*QUERY-IO*
(在
读行
和前面的
格式中)。这样开发环境(如SLIME/SLY)就可以理解它是一个提示符。您还应该放置一个
(FINISH-OUTPUT*QUERY-IO*)
,以确保在尝试读取任何内容之前打印提示。通常情况下,您不会递归调用读取文件,而是在重新启动案例表单周围使用循环。@RainerJoswig能否请您提供一些背景信息,说明为什么要在此处避免递归?如果没有TCO,您将在堆栈上多次调用读取文件在多次调用重新启动的情况下……请注意,作为Homedirectory的路径名中的Tilde是特定于实现的,尽管我希望所有基于Unix/Linux的实现都支持它。请注意,作为Homedirectory的路径名中的Tilde是特定于实现的,尽管我希望所有基于Unix/Linux的实现都支持它我们会支持的。