Разграничение вывода в Лиспе - PullRequest
0 голосов
/ 11 января 2019

Я уверен, что это очень простой вопрос, но как вывести значения с разделителями?

(defun q (n)
    (if (<= n 2)
        1
        (+
            (q (- n (q (- n 1))))
            (q (- n (q (- n 2)))))))

(loop for x from 1 to 25
     do (
        write (q x)))

Выше приведены первые 25 членов Q-последовательности Хофштадтера, но конкатенированные:

11233455666888109101111121212121614

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

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Вы можете написать разделитель самостоятельно, e. г. (write ", "). Вы также можете написать (зависимый от платформы) разделитель строк с помощью (terpri).

Что касается format, вы можете сначала обойтись некоторым базовым использованием:

(format <stream> <template> <args…>)
  • <stream> - это то место, куда должен идти вывод. Для стандартного вывода используйте t. Для записи в файл вы должны использовать поток, созданный with-open-file здесь.
  • <template> - строка шаблона. Это просто строка, но символ ~ особенный. Для начала просто используйте ~a везде, где вы хотите вставить аргумент.
  • <args…> - это ровно столько же аргументов, сколько вы использовали ~a выше.

Используя этот простой набор инструментов, вы можете сделать: (format t "~a, " (q x)) для каждого элемента.

Формат имеет много других возможностей, e. г. он может перебирать список сам по себе, делать разные выходные форматы и экранировать или даже расширяться пользовательскими функциями. Посмотрите это в гиперспецификации (например, на clhs.lisp.se).

0 голосов
/ 11 января 2019

используйте write-char или, действительно, format:

(format t "~D: ~:D~%" x (q x))
...