gpt4 book ai didi

common-lisp - 在 common lisp 中加入一系列路径组件

转载 作者:行者123 更新时间:2023-12-05 09:22:55 26 4
gpt4 key购买 nike

如何在 common lisp 中连接一系列路径组件?

在 python 中,我可以做到,

`os.path.join("/home/", username, "dira", "dirb", "dirc");`

普通 lisp 中的等价物是什么?

当然我可以编写自己的函数,但我怀疑我应该能够使用一些内置的东西。

最佳答案

如果您坚持使用字符串来表示路径名,那么除了自己动手之外似乎没有内置的解决方案。

(defun join-strings (list &key (separator "/") (force-leading nil))
(let* ((length (length list))
(separator-size (length separator))
(text-size (reduce #'+ (mapcar #'length list) :initial-value 0))
(size (+ text-size (* separator-size (if force-leading length (1- length)))))
(buffer (make-string size)))
(flet ((copy-to (position string)
(loop
:with wp := position
:for char :across string
:do (setf (char buffer (prog1 wp (incf wp))) char)
:finally (return wp))))
(loop
:with wp := 0
:for string :in list
:do (when (or force-leading (plusp wp)) (setf wp (copy-to wp separator)))
(setf wp (copy-to wp string)))
buffer)))

(join-strings '("home" "kurt" "source" "file.txt") :force-leading t)
==> "/home/kurt/source/file.txt"

但是,如果您可以使用 pathnames ,然后你可以,例如,做:

(merge-pathnames #P"subdir1/subdir2/file.type" #P"/usr/share/my-app")
==> #P"/usr/share/my-app/subdir1/subdir2/file.type"

路径名 API 还提供了以符号方式操作路径名、提取路径名的组件等功能:

(pathname-directory #P"subdir1/subdir2/file.type")
==> '(:relative "subdir1" "subdir2")

(pathname-name #P"subdir1/subdir2/file.type")
==> "file"

(pathname-type #P"subdir1/subdir2/file.type")
==> "type"

(make-pathname :name "file" :type "type" :directory '(:relative "subdir1" "subdir2"))
==> #P"subdir1/subdir2/file.type"

特别是,路径名的 directory 组件表示为列表,因此,您可以使用完整的列表处理函数集从中派生 directory 值其他:

(make-pathname :directory (append '(:absolute "usr" "share") '("more" "stuff"))
:name "packages" :type "lisp")

关于common-lisp - 在 common lisp 中加入一系列路径组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24360558/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com