如何在 Lisp 的 for 循环中调用函数?

How to invoke a function within a for loop in Lisp?

我的文件夹中有 25 个文本文件需要测试。但我不想为 25 个文件编写代码,这意味着测试这些文件需要 25 行。

(myfunc "myfiles/txtfile1.txt")
(myfunc "myfiles/txtfile2.txt")
...

如何使用for循环来调用这个函数?就像下面的示例代码。抱歉我的英语不好

(loop for x from 1 to 25
  do ((myfunc "myfiles/txtfile~a.txt" x))
) 
)

您可以连接文件名末尾的数字,格式为:

(循环 x 从 1 到 25 do (myfunc (format nil "myfiles/txtfile~a.txt" x)) )

一个简单的方法是使用format函数(manual):

(loop for x from 1 to 25
      do (myfunc (format nil "myfiles/txtfile~a.txt" x)))

由于所有文件都在一个目录中,您还可以查看 directory 预定义函数 (manual, question in SO)。

一些函数式方法

(mapcar function (directory (merge-pathnames wildcard path)))

mapcar - 将 function 应用于由 directory 生成的提供的参数列表。 function 必须只接受一个参数。

工作示例

61650326.lisp

;;;; File     : 61650326.lisp
;;;; Modified : <2020-5-08 Fri 08:51:12 BST>
;;;; URL      : 

(defparameter *user-path* "t/user/myfiles/")
(defparameter *wildcard* "*.txt")
(defparameter *function* 'type-of)

(defun map-on-files (path wildcard function)
    "Map FUNCTION on a list of files found under PATH WILDCARD."
    (mapcar function (directory (merge-pathnames wildcard path))))

(format t "~{~A~%~}" (map-on-files *user-path* *wildcard* *function*))

正在生成一些用于测试目的的文件:

~$: mkdir -p t/user/myfiles
~$: for i in $(seq 10); do mktemp -p t/user/myfiles/ --suffix=.txt; done
t/user/myfiles/tmp.S4wKkJ85sq.txt
t/user/myfiles/tmp.j3XeT2hneq.txt
t/user/myfiles/tmp.mut6GLhlaT.txt
t/user/myfiles/tmp.1l0I5oGDaR.txt
t/user/myfiles/tmp.hBpvOfarye.txt
t/user/myfiles/tmp.m1WfmZxrU8.txt
t/user/myfiles/tmp.o6QbvjXMh9.txt
t/user/myfiles/tmp.6CmPvWf7GO.txt
t/user/myfiles/tmp.ZNWcaymY0g.txt
t/user/myfiles/tmp.JfUQ4cW0dD.txt

和运行代码段

~$: sbcl --script 61650326.lisp
PATHNAME
PATHNAME
PATHNAME
PATHNAME
PATHNAME
PATHNAME
PATHNAME
PATHNAME
PATHNAME
PATHNAME