print

Распечатайте объекты на экран

Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.

Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.

Для печати в MATLAB® смотрите print. Для отображения значения смотрите display.

Синтаксис

print(<Unquoted>, <NoNL>, <KeepOrder>, <Plain>, <Typeset>, object1, object2, …)

Описание

print(object) отображает object на экране.

На интерактивном уровне результат команды MuPAD®, вводимой в командную строку, обычно отображается на экране автоматически. print служит, чтобы сгенерировать дополнительный вывод из циклов или процедур.

Кроме некоторых исключений, упомянутых ниже, вывод, сгенерированный print, идентичен обычному выводу результатов MuPAD на интерактивном уровне.

print оценивает свои аргументы последовательно слева направо (cf. Пример 3) и отображения результаты на экране. Отдельные выходные параметры разделяются запятыми. Новая строка запускается в конце вывода, если это не подавлено опцией NoNL.

Вывод width для print с опцией Plain ограничивается переменной окружения TEXTWIDTH. Cf. Пример 4.

С опцией Plain стиль вывода определяется значением переменной окружения PRETTYPRINT. Cf. Пример 5.

print убывает рекурсивно в операнды объекта. Для каждого подобъекта s print сначала определяет свою область typeT. Если доменный T имеет слот "print", то print издает приказ T::print(s) к стандартной программе слота. В отличие от перегружающегося механизма для большинства других функций MuPAD, print обрабатывает результат этого вызова рекурсивно, и результат рекурсивного процесса распечатан в положении s (cf. Пример 6.

Примечание

Результат, возвращенный методом "print", не должен содержать доменный элемент сам s как подобъект, поскольку это приводит к бесконечной рекурсии (cf. Пример 7. Тот же комментарий также применяется к выходным процедурам функциональных сред (см. ниже).

Если T является областью библиотеки без слота "print", и внутренними операндами s является op1, op2, ..., то s распечатан как new(T, op1, op2, ...). (См. Пример 6.)

Методы "print" могут возвращаемые строки или выражения. Строки всегда распечатываются закрывшие кавычки. Выражения распечатаны в режиме normal mode. Если они будут содержать строки, они будут распечатаны с кавычками. Cf. Пример 8.

Вывод expression определяется 0th операндом выражения. Если 0th операндом является function environment, то его второй операнд обрабатывает вывод выражения. Смотрите Пример 9. В противном случае выражение распечатано в функциональном обозначении.

В отличие от обычного вывода объектов MuPAD на интерактивном уровне, print не выполняет перезамену псевдонимов (см. Pref::alias для деталей). Кроме того, стандартные программы, заданные через Pref::output и Pref::postOutput, не вызваны print. Cf. Пример 14.

Вывод floating-point numbers зависит от переменной окружения DIGITS и настройки Pref::floatFormat (экспоненциальное или представление с плавающей точкой) и Pref::trailingZeroes (печать конечных нулей). Cf. Пример 16.

Взаимодействия среды

print чувствителен к переменным окружения DIGITS, PRETTYPRINT и TEXTWIDTH, и к выходным настройкам Pref::floatFormat, Pref::keepOrder и Pref::trailingZeroes.

Примеры

Пример 1

Этот пример показывает простой вызов print со строками в качестве аргументов. Они распечатаны с кавычками:

print("Hello", "You"." !"):

Пример 2

На наборе поддержки платформ print может сгенерировать набранный вывод:

print(Typeset, int(f(x)/g(x), x = a..b)):

print использует опцию Typeset по умолчанию:

print(int(f(x)/g(x), x = a..b)):

ASCII вывод доступен с опцией Plain:

print(Plain, int(f(x)/g(x), x = a..b)):
  b
  /
 |  f(x)
 |  ---- dx
/   g(x)
  a

Пример 3

Как большинство других функций, print оценивает свои аргументы. В следующем вызове x оценивает к 0, и cos(0) оценивает к 1:

a := 0: print(cos(a)^2):

Используйте hold, если вы хотите распечатать выражение cos(a)^2 буквально:

print(hold(cos(a)^2)):

delete a:

Пример 4

print с опцией Plain чувствителен к текущему значению TEXTWIDTH:

print(Plain, expand((a + b)^4)):
 4      3        2  2        3    4
a  + 4 a  b + 6 a  b  + 4 a b  + b
TEXTWIDTH := 25:
print(Plain, expand((a + b)^4)):
 4      3        2  2
a  + 4 a  b + 6 a  b

          3    4
   + 4 a b  + b

Если вы отключаете режим структурной распечатки программы, функция print вставляет символ продолжения строки в разрывах строки:

PRETTYPRINT:=FALSE:
print(Plain, expand((a + b)^4)):
a^4 + 4*a^3*b + 6*a^2*b^\
2 + 4*a*b^3 + b^4

Символ продолжения строки может быть недопустимым для некоторых строк. Например, когда вы используете генераторы кода, такие как generate::MATLAB и generate::Simscape, отображенный код, содержащий символ продолжения строки, не допустим. Чтобы постараться не вставлять этот символ, измените настройки TEXTWIDTH или используйте функцию fprint вместо print:

fprint(Unquoted, 0, expand((a + b)^4))
a^4 + 4*a^3*b + 6*a^2*b^2 + 4*a*b^3 + b^4

Кроме того, смотрите Пример 4 на странице справки fprint.

PRETTYPRINT := TRUE:
delete TEXTWIDTH:

Пример 5

print с опцией Plain чувствителен к текущему значению PRETTYPRINT:

print(Plain, a/b):
old := PRETTYPRINT: PRETTYPRINT := FALSE:
print(Plain, a/b):
PRETTYPRINT := old:
a
-
b
a/b
delete old:

Пример 6

Мы демонстрируем, как достигнуть отформатированного вывода для элементов пользовательской области. Предположим, что мы хотим записать новый доменный Complex для комплексных чисел. Каждый элемент этой области имеет два операнда: действительная часть r и мнимая часть s:

Complex := newDomain("Complex"): z := new(Complex, 1, 3):
z + 1;
print(Plain, z + 1):

new(Complex, 1, 3) + 1

Теперь мы хотим более хороший вывод для элементов этой области, а именно, в форме r+s*I, где I обозначает мнимую единицу. Мы реализуем стандартную программу слота Complex::print, чтобы обработать это. Эта стандартная программа слота будет вызвана MuPAD с элементом доменного Complex в качестве аргумента каждый раз, когда такой элемент должен быть распечатан на экране:

Complex::print := (z -> extop(z, 1) + extop(z, 2)*I):
z + 1;
print(Plain, z + 1):

1 + 3 I + 1
delete Complex, z:

Пример 7

Результат метода "print" не должен содержать аргумент как подобъект; в противном случае это приводит к бесконечной рекурсии. В следующем примере стандартная программа слота T::print назывался бы бесконечно часто. MuPAD пытается захватить такие бесконечные рекурсии и распечатывает `????` вместо этого:

T := newDomain(T): T::print := id:
new(T, 1);
print(Plain, new(T, 1)):
`????`
`????`
delete T:

Пример 8

Если метод "print" возвратит строку, он будет распечатан закрывший кавычки:

Example := newDomain("Example"):  e := new(Example, 1):
Example::print := x -> "elementOfExample":
print(e):

Если "print" - метод возвратит выражение, он будет распечатан в режиме normal mode. Если выражение будет содержать строки, они будут распечатаны обычным способом с кавычками:

Example::print := x -> ["elementOfExample", extop(x)]:
print(e):

delete Example, e:

Пример 9

Предположим, что вы задали функциональный f, который может возвратить себя символически, и вы хотите, чтобы такие символьные выражения формы f(x,...) были распечатаны специальным способом. С этой целью встройте свой proceduref в функциональную среду и предоставьте выходную процедуру в качестве второго аргумента к соответствующему вызову funcenv. Каждый раз, когда выражение формы, f(x,...) должен быть распечатан, выходная процедура, будет вызвано аргументами x,... выражения:

f := funcenv(f,
         proc(x) begin
            if nops(x) = 2 then
              "f does strange things with its arguments ".
              expr2text(op(x, 1))." and ".expr2text(op(x,2))
            else
              FAIL
            end
         end):
delete a, b:
f(a, b)/2;
f(a, b, c)/2

delete f:

Пример 10

С опцией Unquoted не использованы кавычки:

print(Unquoted, "Hello", "World"." !"):
Hello, World !

С Unquoted специальные символы расширены \t и \n:

print(Unquoted, "As you can see,\n".
                "'\\n' is the newline character\n".
                "\tand '\\t' a tabulator"):
As you can see,
'\n' is the newline character
  and '\t' a tabulator

Пример 11

Полезно создать выводимые строки с помощью expr2text и оператора конкатенации .:

d := 5:  print(Unquoted, "d plus 3 = ".expr2text(d + 3)):
d plus 3 = 8
delete d:

Пример 12

С опцией NoNL никакая новая строка не помещается в конце вывода, и PRETTYPRINT неявно установлен в FALSE. Кроме этого, поведение совпадает с с опцией Unquoted:

print(NoNL, "Hello"):  print(NoNL, ",  You"." !\n"):
print(NoNL, "As you can see, PRETTYPRINT is FALSE: "):
print(NoNL, x^2-1):  print(NoNL, "\n"):
Hello
,  You !
As you can see, PRETTYPRINT is FALSE: 
x^2 - 1

Пример 13

Если опция, которую KeepOrder дан, суммы, распечатана в их внутреннем порядке:

print(b - a):  print(KeepOrder, b - a):

Пример 14

Исказите перезамену (см. Pref::alias), происходит для нормального результата выходные параметры на интерактивном сеансе, но не для выходных параметров, сгенерированных print:

delete a, b: alias(a = b):
a; print(a):
unalias(a):

В отличие от обычного результата вывод, print не реагирует на Pref::output:

old := Pref::output(generate::TeX):
sin(a)^b; print(sin(a)^b):
Pref::output(old):

То же самое верно для Pref::postOutput:

old := Pref::postOutput("postOutput was called"):
a*b; print(a*b):
Pref::postOutput(old):

postOutput was called

delete old:

Пример 15

Вывод слагаемых суммы зависит от формы этих слагаемых. Если слагаемое является выражением _mult, только первый и последний операнд продукта учтен для определения знака того термина в выводе. Если один из них является отрицательным числом затем "+" - символ в сумме заменяется "-" - символ:

print(hold(a + b*c*(-2)),
      hold(a + b*(-2)*c),
      hold(a + (-2)*b*c)):

Это должно быть учтено при записи "print" - методы для полиномиальных областей.

Пример 16

Числа с плавающей точкой обычно распечатываются в представлении с фиксированной точкой. Можно изменить это на форму с плавающей точкой с мантиссой и экспонентой через Pref::floatFormat:

print(0.000001, 1000.0): old := Pref::floatFormat("e"):
print(0.000001, 1000.0): Pref::floatFormat(old):

В выводе по умолчанию чисел с плавающей запятой отключены конечные нули. Это поведение может быть изменено через Pref::trailingZeroes:

print(0.000001, 1000.0): old := Pref::trailingZeroes(TRUE):
print(0.000001, 1000.0): Pref::trailingZeroes(old):
0.000001, 1000.0
0.000001000000000, 1000.000000

Количество цифр чисел с плавающей запятой в выводе зависит от переменной окружения DIGITS:

print(float(PI)):
DIGITS := 20:  print(float(PI)):
DIGITS := 30:  print(float(PI)):

delete old, DIGITS:

Пример 17

Выходной порядок sets отличается от внутреннего порядка наборов, который возвращен op:

s := {a, b, 1}:
s;
print(Plain, s):
op(s)

{1, a, b}

Индексный оператор [] может использоваться, чтобы получить доступ к элементам набора относительно выходного порядка:

s[1], s[2], s[3]

delete s:

Пример 18

Вывод области определяется ее слотом "Name", если он существует, и в противном случае его ключом:

T := newDomain("T"):
T;
print(Plain, T):

T
T::Name := "domain T":
T;
print(Plain, T):

domain T
delete T:

Пример 19

Иногда желательно объединить строки с “симпатичными” выражениями в выводе. Это не возможно через expr2text. С другой стороны, вывод с запятыми как разделители обычно рассматривается как ужасный. Следующая фиктивная последовательность выражения может использоваться, чтобы достигнуть желаемого результата. Это использует MuPAD внутренняя функция для стандартного оператора вывод builtin(1100,...), с приоритетом 20 — приоритет _exprseq — и с пустым символом оператора "":

myexprseq := funcenv(myexprseq,
                     builtin(1100, 20, "", "myexprseq")):
print(Unquoted,
      myexprseq("String and pretty expression ", a^b, ".")):
                              b
String and pretty expression a .
delete myexprseq:

Пример 20

Если опция, Typeset объединен с Unquoted или NoNL, предупреждением, дана, и Typeset проигнорирован:

print(Typeset, Unquoted, "1"):
Warning: Conflicting options, ignoring 'Typeset' [print]

Пример 21

Для более тщательно продуманных конструкций можно хотеть объединить многострочные строки с выражениями MuPAD. Первая попытка может быть похожей на следующее:

myexprseq := funcenv(myexprseq,
                     builtin(1100, 20, "", "myexprseq")):
Example := newDomain("Example"):
Example::print :=
  x -> myexprseq("--- \n--\n-\n--\n---", op(x)):
e := new(Example, 1):
print(Plain, e):
"--- \n--\n-\n--\n---"1

Очевидно, этот подход не работает. Возвращаемое значение метода "print", заданного выше, не является строкой, это - (специальная) последовательность, таким образом, специальные правила для печати строки не применяются. Нам была бы нужна другая область, которая просто берет строку и возвращает точно эту строку в ее слот "print". К счастью, MuPAD уже имеет такую область, stdlib::Exposed:

Example::print :=
  x -> myexprseq(stdlib::Exposed("--- \n--\n-\n--\n---"),
                 op(x)):
print(e):
---
--
-   1
--
---

Для выражений с более высоким выводом вы видите, что выравнивание строки является постоянным:

new(Example,x^(1/n));
new(Example,x/y)
---
--   1/n
-   x
--
---
---
--  x
-   -
--  y
---

Чтобы изменить это выравнивание, замените \n \b, таким образом, делая строку, это отключает “базовую линию” строки:

Example::print :=
  x -> myexprseq(stdlib::Exposed("--- \b--\n-\n--\n---"),
                 op(x)):
print(e+2):
--- 1 + 2
--
-
--
---

Когда несколько, \b появляется в строке, первая, взяты в качестве определения базисной линии:

Example::print :=
  x -> myexprseq(stdlib::Exposed("--- \n--\n-\b--\b---"),
                 op(x)):
print(e+2):
---
--
-   1 + 2
--
---

Параметры

object1, object2, …

Любые объекты MuPAD

Опции

Unquoted

При использовании этой опции символьные строки отображены без кавычек. Кроме того, управляющие символы \n, \t и \\ в строках расширены в новую строку, пропуск табулятора и одну наклонную черту влево \, соответственно. Cf. Пример 10.

Управляющий символ \t расширен с размером вкладки 8. Следующий символ помещается в следующий столбец i с i mod 8 = 0.

\b расширен в новую строку также, но при объединении нескольких строк, последняя строка с \b в ее конце рассматривается как “базовая линия”. Cf. Пример 21.

Примечание

Опция Unquoted неявно устанавливает опцию Plain. Если опция, Typeset используется вместе с Unquoted, предупреждение, дана, и Typeset проигнорирован. Cf. Пример 20.

NoNL

Эта опция имеет ту же функциональность как Unquoted. Кроме того, новая строка в конце вывода подавлена. Cf. Пример 12.

Кроме того, эта опция неявно устанавливает PRETTYPRINT на FALSE.

Примечание

Опция NoNL неявно устанавливает опцию Plain. Если опция, Typeset используется вместе с NoNL, предупреждение, дана, и Typeset проигнорирован. Cf. Пример 20.

KeepOrder

Эта опция определяет порядок условий в суммах. Обычно, система сортирует условия sum, таким образом, что положительный термин находится в первом положении вывода. Если KeepOrder дан, никакое такое переупорядочение не происходит, и суммы распечатаны во внутреннем порядке. Cf. Пример 13.

Этим поведением можно также управлять через Pref::keepOrder. Более точно вызов print(KeepOrder, ...) генерирует тот же вывод как следующая команда:

Pref::keepOrder(Always):
print(...):
Pref::keepOrder(%2):

Plain

Вывод находится в режиме простого текста. Это - поведение по умолчанию в версии программы. В текстовом режиме значение PRETTYPRINT определяет, линеен ли вывод или в более читаемой 2D форме.

Typeset

Вывод находится в наборном режиме. Это - поведение печати по умолчанию в блокноте, если никакие другие опции не даны. Опция только сохранена для обратной совместимости.

В наборном режиме проигнорировано значение PRETTYPRINT.

Возвращаемые значения

print возвращает пустой объект null() типа DOM_NULL.

Перегруженный

object1, object2

Алгоритмы

Выходной порядок sets отличается от внутреннего порядка наборов, которые могут быть получены через op. Для этого переупорядочения в выводе, вызовы ядра метод DOM_SET::sort, который берет набор в качестве аргумента и возвращает отсортированный список. Элементы набора затем распечатаны в распоряжении, данном этим списком.

Смотрите также

Области MuPAD

Функции MuPAD