【问题标题】:How to invoke a function within a for loop in Lisp?如何在 Lisp 的 for 循环中调用函数?
【发布时间】:2020-05-07 05:11:56
【问题描述】:

我的文件夹中有 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))
) 
)

【问题讨论】:

标签: for-loop lisp common-lisp


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      一些函数式方法

      (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      : https://stackoverflow.com/questions/61650326
      
      (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
      

      然后运行代码sn-p

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

      【讨论】:

      • 实际上,这正是我想做的,但我是 Lisp 的新手。我的路径是“user/myfiles/textfile.txt”你能从这个路径给我一个例子,我如何读取这个文件夹中的所有文件?
      • @JuanRodre 我用更明确的例子扩展了答案
      • 非常感谢@Hellseher
      猜你喜欢
      • 2018-09-23
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      相关资源
      最近更新 更多