如何从 LISP 中的文件中删除行?

问题描述

我目前正在尝试使用 LISP 从文件删除行。

(defun remove_line_from_file (file line_number)
    
)

(defun remove_lines_from_file (file lines)
    (if (not (null lines))
        (progn
            (remove_line_from_file (file (car (sort lines #'>))))
            (remove_lines_from_file (file (cdr (sort lines #'>))))
        )
    )
)

我不知道我该怎么做。我所做的是递归。

调用示例:

(remove_lines_from_file "file_name" (2 3 5 6))

如何从文件删除指定的行?

(remove_line_from_file "file_name" 2)

解决方法

注意事项:

  1. snake_case 不是 Lispy,请使用 lisp-case(又名 kebab case)
  2. sort 改变它的参数,所以在你的情况下它对输入列表有副作用;您需要改为执行 (sort (copy-list list) ...)
  3. 您似乎试图在 lines 上进行递归,这看起来效率很低;您可能想遍历文件一次

您需要打开文件进行读取,在增加行计数器的同时遍历所有行,并复制每一行(例如写入标准输出),除非行号是要删除的行之一:

(defun remove-lines (file lines-to-remove)
  (with-open-file (in file)
    (loop
      for line-number from 1
      for line = (read-line in nil nil)
      while line
      unless (member line-number lines-to-remove)
        do (write-line line))))