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的实现都支持它我们会支持的。