Объединить числа с пробелами в Common Lisp? - PullRequest
2 голосов
/ 10 марта 2019

Записывая простой цикл для программы на Лиспе, я хочу, чтобы мои числа печатались с пробелами между ними,

(loop for i from 1 to 5
      do 
      (prin1  i))

печать:

12345

id нравится, чтобы напечатать:

1 2 3 4 5

но я не могу найти информацию о печати пробелов в любом месте. Любая помощь приветствуется!

Ответы [ 5 ]

5 голосов
/ 10 марта 2019

Все достаточно зрелые языки программирования проходят стадию добавления в строки другого языка программирования, часто для управления выводом на печать. Действительно зрелые языки программирования проходят этот этап: CL еще не настолько зрел, и все еще имеет FORMAT управляющие строки. И вы можете делать с ними что угодно.

Небольшой вариант вашего примера - заставить FORMAT напечатать список:

> (format t "~&~{~A~^, ~}.~%" '(1 2 3 4 5))
1, 2, 3, 4, 5.

Что означает эта управляющая строка:

  1. ~& - находиться в начале строки;
  2. ~{ - начать итерацию по списку;
  3. ~A - печатать каждый элемент как PRINC;
  4. ~^ - после печати последнего элемента остановитесь здесь;
  5. , - печатать запятую и пробел для каждого другого элемента;
  6. ~} - конец цикла над элементами;
  7. . - вывести стоп в конце списка;
  8. ~% - вывести символ новой строки.

Это сравнительно простой пример использования FORMAT управляющих строк : можно делать довольно сложные вещи.


(На самом деле, конечно, CL - это CL, очевидно, можно без проблем добавить к нему более структурированный язык управления выводом, и я уверен, что люди это сделали. Итак, CL в некотором смысле прошел стадию: FORMAT управляющие струны для некоторых являются просто окаменелым остатком).

4 голосов
/ 11 марта 2019

С библиотекой, печатая строку:

(ql:quickload "str")
(str:join " " (loop for i from 1 to 5 collect i))
;; "1 2 3 4 5"

https://github.com/vindarel/cl-str/

больше:

но я рекомендую использовать format.

3 голосов
/ 10 марта 2019

Вам нужно как-то распечатать пробел самостоятельно. Простое расширение вашего кода:

(loop for i from 1 to 5
      do (princ i)
         (princ #\space))

(обратите внимание, что я использовал princ вместо prin1.)

1 голос
/ 11 марта 2019
CL-USER 67 > (loop with start = 1 and end = 5
                   for i from (1+ start) to end
                   initially (princ start)
                   do (princ #\space) (princ i))
1 2 3 4 5
NIL
1 голос
/ 11 марта 2019

Вы можете использовать функцию форматирования с директивами форматирования:

(loop for i from 1 to 5
      do
      (format t "~A " i))

ваш вывод:

1 2 3 4 5

Директива ~ A является просто заполнителем для значения, в данном случаезначение хранится в переменной я.Это похоже на функцию формата Pythons.

...