【问题标题】:returning a value in lisp programming在 lisp 编程中返回一个值
【发布时间】:2020-02-15 14:39:44
【问题描述】:

我有一个函数

(defun read-as-list (filename)

    (defparameter parlist(list nil) )
    (let ((in (open filename :if-does-not-exist nil)))
        (when in
            (loop for line = (read-line in nil)
                 while line do
                    (defparameter mylist line)
                    (push mylist (cdr (last parlist)))
                    ;(append parlist (list mylist))
                    ;(print mylist)
                    ;(format t "~a~%" line)
            )
            (close in)
        )
    )
    (print parlist)
    (return-from read-as-list parlist)
)

它只是获取一个文件名并将其读入嵌套列表并返回该列表

我在 down 函数中这样称呼它:

(defun test_on_test_data ()
    (print "....................................................")
    (print "Testing ....")
    (print "....................................................")

    (let (con (read-as-list "document1.txt"))
        (print con)
    )   
)

(test_on_test_data)

在函数test-on-test-data中,con打印nil,它不调用函数read-as-list

而不是将文件的内容打印为列表,而是打印nil

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 可能是找不到文件,先用绝对路径试一下确定。
  • 不要将 DEFPARAMETER 放在函数中。 DEFPARAMETER 用于声明全局变量。
  • 使用 WITH-OPEN-FILE 代替 OPEN/CLOSE
  • RETURN-FROM 不是必需的 - 最后一个值会自动返回。
  • test_on_test_data 函数中你没有正确使用let!它应该是 (let ((con 而不是 (let (conlet 采用列表定义,而不是单个定义。

标签: lisp common-lisp return-value let clisp


【解决方案1】:

这是一个示例函数,您可以使用它来测试如何迭代文件中的行。它接受一个路径名指示符和一个回调函数,并为文件中的所有行执行该函数。该函数必须接受一个参数,即正在读取的行。

(defun maplines (function path)
  (with-open-file (in path)
    (loop for line = (read-line in nil nil)
          while line
          do (funcall function line))))

注意代码是如何缩进的,以及如何使用with-open-file 处理文件的打开和关闭。 此外,函数体内没有defparameter,因为该形式用于声明全局变量。 无需使用 return,因为函数体中的最后一个值自动成为函数调用的值。

那么,你可以例如这样称呼它:

(maplines #'print "/tmp/test.data")

与您的代码不同,如果文件不存在,则会发出错误信号。在您的情况下,您通过提供nil 并且在空流上什么都不做,默默地忽略了错误。

最后,您只需要使用一个函数来存储正在读取的行。或者,如果您还不知道如何执行此操作,请修改上面的 sn-p 以删除对 funcall 的调用并在循环中使用 collect。您将获得所有行的列表。

【讨论】:

    猜你喜欢
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多