Почему read-line запускается дважды для чтения из файла в Лиспе? - PullRequest
6 голосов
/ 26 сентября 2010

Это код для реализации команды 'cat' с lisp, как объяснено в книге ANSI Common Lisp , стр. 122.

(defun pseudo-cat (file)
  (with-open-file (str file :direction :input)
    (do ((line (read-line str nil 'eof)
               (read-line str nil 'eof)))
        ((eql line 'eof))
      (format t "~A~%" line))))

Почему чтениеЛинейная функция запускается дважды?Я пытался запустить его только с одной строкой чтения, но Lisp не смог завершить код.

Ответы [ 3 ]

11 голосов
/ 26 сентября 2010

Синтаксис переменных DO: переменная, форма инициализации, форма обновления.В этом случае форма инициализации совпадает с формой обновления.Но в DO нет сокращения для этого случая, поэтому вы должны записать его дважды.

5 голосов
/ 26 сентября 2010

Вам необходимо прочитать синтаксис DO: http://www.lispworks.com/documentation/HyperSpec/Body/m_do_do.htm

Первая форма READ-LINE - это форма init, а вторая - пошаговая форма.Таким образом, в первой итерации переменная устанавливается на результат init-формы.На следующих итерациях переменной присваивается значение пошаговой формы.

0 голосов
/ 26 сентября 2010

Вы можете использовать (listen file) для проверки, если можете читать из файла.

Это моя функция печати файла

(defun print-file (filename)
  "Print file on stdout."
  (with-open-file (file filename :direction :input)
          (loop
             (when (not (listen file)) (return))
             (write-line (read-line file)))))
...