common-lisp
format
Szukaj…
Parametry
Lambda-List | (format DESTINATION CONTROL-STRING &REST FORMAT-ARGUMENTS) |
---|---|
DESTINATION | rzecz do pisania. Może to być strumień wyjściowy, t (skrót dla *standard-output* ) lub nil (co tworzy ciąg do zapisu) |
CONTROL-STRING | ciąg szablonu. Może to być prymitywny ciąg znaków lub zawierać poprzedzone tyldą dyrektywy polecenia, które określają i w jakiś sposób przekształcają dodatkowe argumenty. |
FORMAT-ARGUMENTS | potencjalne dodatkowe argumenty wymagane przez dany CONTROL-STRING . |
Uwagi
Dokumentację CLHS dla dyrektyw FORMAT
można znaleźć w rozdziale 22.3 . Za pomocą SLIME można wpisać Cc Cd ~
aby wyszukać w dokumentacji CLHS konkretną dyrektywę formatu.
Podstawowe użycie i proste dyrektywy
Pierwsze dwa argumenty do sformatowania to strumień wyjściowy i łańcuch kontrolny. Podstawowe użycie nie wymaga dodatkowych argumentów. Przekazywanie t
podczas zapisu strumienia do *standard-output*
.
> (format t "Basic Message")
Basic Message
nil
To wyrażenie wypisze Basic Message
na standardowe wyjście i zwróci nil
.
Przekazywanie wartości nil
jako strumienia tworzy nowy ciąg i zwraca go.
> (format nil "Basic Message")
"Basic Message"
Większość dyrektyw dotyczących ciągów kontrolnych wymaga dodatkowych argumentów. ~a
Dyrektywa („estetyczna”) wypisze każdy argument, tak jak w procedurze princ
. Spowoduje to wydrukowanie formularza bez żadnych znaków zmiany znaczenia (słowa kluczowe są drukowane bez wiodącego dwukropka, ciągi bez otaczających je cudzysłowów itp.).
> (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
opcjonalnie prawy lub lewy pad-pad oparty na dodatkowych wejściach.
> (format nil "A Test: ~10a" "Example")
"A Test: Example "
> (format nil "A Test: ~10@a" "Example")
"A Test: Example"
Dyrektywa ~s
jest jak ~a
, ale drukuje znaki specjalne.
> (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\""
Iterowanie po liście
Można iterować po liście za pomocą dyrektyw ~{
i ~}
.
CL-USER> (format t "~{~a, ~}~%" '(1 2 3 4 5))
1, 2, 3, 4, 5,
~^
można użyć do ucieczki, jeśli nie ma już więcej elementów.
CL-USER> (format t "~{~a~^, ~}~%" '(1 2 3 4 5))
1, 2, 3, 4, 5
Argument numeryczny można podać do ~{
celu ograniczenia liczby iteracji:
CL-USER> (format t "~3{~a~^, ~}~%" '(1 2 3 4 5))
1, 2, 3,
~@{
przejdzie do pozostałych argumentów zamiast listy:
CL-USER> (format t "~a: ~@{~a~^, ~}~%" :foo 1 2 3 4 5)
FOO: 1, 2, 3, 4, 5
Podlisty można powtarzać za pomocą ~:{
:
CL-USER> (format t "~:{(~a, ~a) ~}~%" '((1 2) (3 4) (5 6)))
(1, 2) (3, 4) (5, 6)
Wyrażenia warunkowe
Wyrażenia warunkowe można wykonać za pomocą ~[
i ~]
. Klauzule wyrażenia są oddzielane za pomocą ~;
.
Domyślnie ~[
pobiera liczbę całkowitą z listy argumentów i wybiera odpowiednią klauzulę. Klauzule zaczynają się od zera.
(format t "~@{~[First clause~;Second clause~;Third clause~;Fourth clause~]~%~}"
0 1 2 3)
; First clause
; Second clause
; Third clause
; Fourth clause
Ostatnią klauzulę można oddzielić ~:;
zamiast tego uczyni to klauzulą else.
(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!
Jeśli wyrażenie warunkowe zaczyna się od ~:[
, oczekuje uogólnionego logicznego wyniku zamiast liczby całkowitej. Może mieć tylko dwie klauzule; pierwsza jest drukowana, jeśli wartość logiczna to NIL
, a druga klauzula, jeśli jest prawdziwa.
(format t "~@{~:[False!~;True!~]~%~}"
t nil 10 "Foo" '())
; True!
; False!
; True!
; True!
; False!
Jeśli wyrażenie warunkowe zaczyna się od ~@[
, powinna istnieć tylko jedna klauzula, która jest wypisywana, jeśli dane wejściowe, uogólniony boolean, były prawdziwe. Wartość logiczna nie zostanie skonsumowana, jeśli będzie zgodna z prawdą.
(format t "~@{~@[~s is truthy!~%~]~}"
t nil 10 "Foo" '())
; T is truthy!
; 10 is truthy!
; "Foo" is truthy!