2015-04-19 2 views
3

Глава 9.10 Common Lisp: Нежное Введение в символьные вычисления претензий:terpri, princ & co. против формата

Примитивный I/O функции TERPRI, PRIN1, PRINC и PRINT были определены в Лиспе 1.5 (предок всех современных Lisp) и до сих пор находятся в Common Lisp. Они включены в раздел «Расширенные темы» в качестве исторической заметки; вы можете получить тот же эффект с FORMAT.

Это означает, что вы не используете princ & co. и что в современном коде вам стоит полагаться только на format.

Есть ли недостатки при этом? Соответственно, есть ли какие-либо вещи, которых невозможно достичь с помощью format, который работает с другими?

+0

Нет, вы не должны полагаться вместо формата и не подразумевается. Просто потому, что вы можете использовать что-то новое, это не значит, что это всегда лучше. – Svante

+0

Я не знаю, что это заслуживает целого ответа, но я нахожу TERPRI особенно полезным при написании довольно печатных процедур, где я * знаю *, что я просто хочу новую строку. Это похоже на '(формат ...«~%») 'просто переполняется, когда я точно знаю, что мне нужно, и мне не нужен формат, чтобы интерпретировать его для меня. Также [FRESH-LINE] (http://www.lispworks.com/documentation/HyperSpec/Body/f_terpri.htm) в отличие от '(format ..." ~ & ")'. –

ответ

4

Эти функции в точности соответствуют следующим FORMAT операторов:

  • TERPRI = ~%
  • FRESH-LINT = ~&
  • PRIN1 = ~S
  • PRINC = ~A
  • PRINT = ~%~S<space>
+0

Существует какая-то функция, подобная «~ A ~%»? (современный печать) –

+0

@ManoelVilela я так не считаю. 'WRITE' - самая общая функция вывода, но я не думаю, что любой из ее вариантов делает это. – Barmar

+0

Спасибо, что ответили. Для меня это забавно, потому что так часто бывает, что на других языках есть функция печати, которую я почти пропустил. Вы действительно можете использовать 'PRINC' +' TEPRI' или даже 'FORMAT' для достижения этого результата, но я пропустил CL stdlib, чтобы иметь функцию типа PRINTLN'. Но неважно, так легко писать, что не стоит обсуждать об этом. Это просто забавная вещь для меня. –

4

Вы также можете использовать более современные write. Я не большой поклонник format из-за его крошечного субязыка, который обычно интерпретируется. Обратите внимание, что хорошая реализация может скомпилировать директивы формата для более эффективного кода. Я использую FORMAT в основном, когда он делает сложный код короче, но не выводить простые предметы или вещи, как одиночный возврат каретки ...

Common Lisp включает в себя три или более поколений текста I/O интерфейсы:

  • старое s-выражение печати подпрограмма
  • специализированные и обобщенные функции потока IO
  • комплекс Formatter, основанный на более раннем Фортран и/или Multics IO форматтеров
  • основополагающей функции для печати объекты
  • красивый принтер

Кроме того, существуют полустандартные функции ввода-вывода CLOS, такие как Gray Streams.

Каждый может иметь свою цель, и никто не уходит скоро ...

CL-USER 54 > (let ((label "Social security number") 
        (colon ": ") 
        (social-security-number '|7537 DD 459234957324 DE|)) 

       (terpri) 
       (princ label) 
       (princ colon) 
       (princ social-security-number) 

       (write-char #\newline) 
       (write-string label) 
       (write-string colon) 
       (write social-security-number :escape nil) 

       (format t "~%~A~A~A" label colon social-security-number) 

       ) 

Social security number: 7537 DD 459234957324 DE 
Social security number: 7537 DD 459234957324 DE 
Social security number: 7537 DD 459234957324 DE 
Смежные вопросы