Как вызвать функцию для l oop в Лиспе? - PullRequest
1 голос
/ 07 мая 2020

У меня в папке есть 25 текстовых файлов для тестирования. Но я не хочу писать код для 25 файлов, что означает, что для тестирования этих файлов требуется 25 строк.

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

Как я могу использовать для l oop, чтобы вызвать эту функцию? Как в примере кода ниже. Простите мой бедный Энгли sh

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

Ответы [ 3 ]

2 голосов
/ 07 мая 2020

Простой способ - использовать функцию format ( manual ):

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

Поскольку все файлы находятся в каталоге, вы также можете взглянуть на directory предопределенная функция ( руководство , вопрос в SO ).

0 голосов
/ 08 мая 2020

Некоторый функциональный подход

(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

И запустить фрагмент кода

~$: sbcl --script 61650326.lisp
PATHNAME
PATHNAME
PATHNAME
PATHNAME
PATHNAME
PATHNAME
PATHNAME
PATHNAME
PATHNAME
PATHNAME
0 голосов
/ 07 мая 2020

Вы можете объединить di git в конце имени файла в формате:

(l oop для x от 1 до 25 do (myfun c (формат nil "myfiles / txtfile ~ a.txt "x)))

...