Поиск…


параметры

Лямбда-List (format DESTINATION CONTROL-STRING &REST FORMAT-ARGUMENTS)
DESTINATION вещь, на которую нужно писать. Это может быть выходной поток, t (сокращенно для *standard-output* ) или nil (который создает строку для записи)
CONTROL-STRING строка шаблона. Это может быть примитивная строка, или она может содержать директивы командной строки с тильд-префиксами, которые определяют и каким-то образом преобразуют дополнительные аргументы.
FORMAT-ARGUMENTS потенциальные дополнительные аргументы, требуемые данным CONTROL-STRING .

замечания

Документацию CLHS для директив FORMAT можно найти в Разделе 22.3 . С помощью SLIME вы можете ввести Cc Cd ~ для поиска документации CLHS для определенной директивы формата.

Основное использование и простые директивы

Первые два аргумента для форматирования - это выходной поток и строка управления. Основное использование не требует дополнительных аргументов. Передача t когда поток записывается в *standard-output* .

> (format t "Basic Message")
Basic Message
nil

Это выражение будет записывать Basic Message в стандартный вывод и возвращать nil .

Передача nil когда поток создает новую строку и возвращает ее.

> (format nil "Basic Message")
"Basic Message"

Большинство директив строки управления требуют дополнительных аргументов. ~a директива ( «эстетическое») напечатает любой аргумент , как будто по princ процедуры. Это печатает форму без каких-либо escape-символов (ключевые слова печатаются без ведущего двоеточия, строки без их окружения и т. Д.).

> (format nil "A Test: ~a" 42)
"A Test: 42"
> (format nil "Multiples: ~a ~a ~a ~a" 1 (list 2 3) "four five" :six)
"Multiples: 1 (2 3) four five SIX"
> (format nil "A Test: ~a" :test)
"A Test: TEST"
> (format nil "A Test: ~a" "Example")
"A Test: Example"

~a опциональный ввод правого или левого вкладок на основе дополнительных входов.

> (format nil "A Test: ~10a" "Example")
"A Test: Example   "
> (format nil "A Test: ~10@a" "Example")
"A Test:    Example"

Директива ~s похожа на ~a , но печатает escape-символы.

> (format nil "A Test: ~s" 42)
"A Test: 42"
> (format nil "Multiples: ~s ~s ~s ~s" 1 (list 2 3) "four five" :six)
"Multiples: 1 (2 3) \"four five\" :SIX"
> (format nil "A Test: ~s" :test)
"A Test: :TEST"
> (format nil "A Test: ~s" "Example")
"A Test: \"Example\""

Итерирование по списку

Можно перебирать список с помощью директив ~{ и ~} .

CL-USER> (format t "~{~a, ~}~%" '(1 2 3 4 5))
1, 2, 3, 4, 5, 

~^ можно использовать для выхода, если осталось больше элементов.

CL-USER> (format t "~{~a~^, ~}~%" '(1 2 3 4 5))
1, 2, 3, 4, 5

Числовой аргумент может быть задан ~{ чтобы ограничить, сколько итераций можно сделать:

CL-USER> (format t "~3{~a~^, ~}~%" '(1 2 3 4 5))
1, 2, 3, 

~@{ будет перебирать оставшиеся аргументы вместо списка:

CL-USER> (format t "~a: ~@{~a~^, ~}~%" :foo 1 2 3 4 5)
FOO: 1, 2, 3, 4, 5

Подсвечники могут быть повторены с помощью ~:{ :

CL-USER> (format t "~:{(~a, ~a) ~}~%" '((1 2) (3 4) (5 6)))
(1, 2) (3, 4) (5, 6) 

Условные выражения

Условные выражения могут быть выполнены с помощью ~[ и ~] . Выражения выражения разделяются с помощью ~; ,

По умолчанию ~[ принимает целое число из списка аргументов и выбирает соответствующее предложение. Оговорки начинаются с нуля.

(format t "~@{~[First clause~;Second clause~;Third clause~;Fourth clause~]~%~}"
        0 1 2 3)
; First clause
; Second clause
; Third clause
; Fourth clause

Последнее предложение может быть разделено ~:; вместо этого сделать это else-clause.

(format t "~@{~[First clause~;Second clause~;Third clause~:;Too high!~]~%~}"
        0 1 2 3 4 5)
; First clause
; Second clause
; Third clause
; Too high!
; Too high!
; Too high!

Если условное выражение начинается с ~:[ , он будет ожидать обобщенного булева вместо целого числа. Он может иметь только два предложения; первая печатается, если логическое значение было NIL , а второе - если оно было правдой.

(format t "~@{~:[False!~;True!~]~%~}"
        t nil 10 "Foo" '())
; True!
; False!
; True!
; True!
; False!

Если условное выражение начинается с ~@[ , должно быть только одно предложение, которое печатается, если ввод, обобщенный логический, является правдивым. Булевы не будут потребляться, если они правдивы.

(format t "~@{~@[~s is truthy!~%~]~}"
        t nil 10 "Foo" '())
; T is truthy!
; 10 is truthy!
; "Foo" is truthy!


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow