如何在 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
我的文件夹中有 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