print
Распечатайте объекты на экран
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.
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
.
Этот пример показывает простой вызов print
со строками в качестве аргументов. Они распечатаны с кавычками:
print("Hello", "You"." !"):
На наборе поддержки платформ 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
Как большинство других функций, print
оценивает свои аргументы. В следующем вызове x
оценивает к 0
, и cos(0)
оценивает к 1
:
a := 0: print(cos(a)^2):
Используйте hold
, если вы хотите распечатать выражение cos(a)^2
буквально:
print(hold(cos(a)^2)):
delete a:
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:
print
с опцией Plain
чувствителен к текущему значению PRETTYPRINT
:
print(Plain, a/b): old := PRETTYPRINT: PRETTYPRINT := FALSE: print(Plain, a/b): PRETTYPRINT := old:
a - b
a/b
delete old:
Мы демонстрируем, как достигнуть отформатированного вывода для элементов пользовательской области. Предположим, что мы хотим записать новый доменный 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:
Результат метода "print"
не должен содержать аргумент как подобъект; в противном случае это приводит к бесконечной рекурсии. В следующем примере стандартная программа слота T::print
назывался бы бесконечно часто. MuPAD пытается захватить такие бесконечные рекурсии и распечатывает `????`
вместо этого:
T := newDomain(T): T::print := id: new(T, 1); print(Plain, new(T, 1)):
`????`
`????`
delete T:
Если метод "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:
Предположим, что вы задали функциональный 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:
С опцией 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
Полезно создать выводимые строки с помощью expr2text
и оператора конкатенации .
:
d := 5: print(Unquoted, "d plus 3 = ".expr2text(d + 3)):
d plus 3 = 8
delete d:
С опцией 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
Если опция, которую KeepOrder
дан, суммы, распечатана в их внутреннем порядке:
print(b - a): print(KeepOrder, b - a):
Исказите перезамену (см. 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:
Вывод слагаемых суммы зависит от формы этих слагаемых. Если слагаемое является выражением _mult
, только первый и последний операнд продукта учтен для определения знака того термина в выводе. Если один из них является отрицательным числом затем "+" - символ в сумме заменяется "-" - символ:
print(hold(a + b*c*(-2)), hold(a + b*(-2)*c), hold(a + (-2)*b*c)):
Это должно быть учтено при записи "print"
- методы для полиномиальных областей.
Числа с плавающей точкой обычно распечатываются в представлении с фиксированной точкой. Можно изменить это на форму с плавающей точкой с мантиссой и экспонентой через 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:
Выходной порядок sets
отличается от внутреннего порядка наборов, который возвращен op
:
s := {a, b, 1}: s; print(Plain, s): op(s)
{1, a, b}
Индексный оператор []
может использоваться, чтобы получить доступ к элементам набора относительно выходного порядка:
s[1], s[2], s[3]
delete s:
Вывод области определяется ее слотом "Name"
, если он существует, и в противном случае его ключом:
T := newDomain("T"): T; print(Plain, T):
T
T::Name := "domain T": T; print(Plain, T):
domain T
delete T:
Иногда желательно объединить строки с “симпатичными” выражениями в выводе. Это не возможно через 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:
Если опция, Typeset
объединен с Unquoted
или NoNL
, предупреждением, дана, и Typeset
проигнорирован:
print(Typeset, Unquoted, "1"):
Warning: Conflicting options, ignoring 'Typeset' [print]
Для более тщательно продуманных конструкций можно хотеть объединить многострочные строки с выражениями 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 -- ---
|
Любые объекты MuPAD |
|
При использовании этой опции символьные строки отображены без кавычек. Кроме того, управляющие символы Управляющий символ
ПримечаниеОпция |
|
Эта опция имеет ту же функциональность как Кроме того, эта опция неявно устанавливает ПримечаниеОпция |
|
Эта опция определяет порядок условий в суммах. Обычно, система сортирует условия Этим поведением можно также управлять через Pref::keepOrder(Always): print(...): Pref::keepOrder(%2): |
|
Вывод находится в режиме простого текста. Это - поведение по умолчанию в версии программы. В текстовом режиме значение |
|
Вывод находится в наборном режиме. Это - поведение печати по умолчанию в блокноте, если никакие другие опции не даны. Опция только сохранена для обратной совместимости. В наборном режиме проигнорировано значение |
print
возвращает пустой объект null()
типа DOM_NULL
.
object1
, object2
Выходной порядок sets
отличается от внутреннего порядка наборов, которые могут быть получены через op
. Для этого переупорядочения в выводе, вызовы ядра метод DOM_SET::sort
, который берет набор в качестве аргумента и возвращает отсортированный список. Элементы набора затем распечатаны в распоряжении, данном этим списком.
DIGITS
| PRETTYPRINT
| Pref::floatFormat
| Pref::keepOrder
| Pref::trailingZeroes
| TEXTWIDTH
| doprint
| expose
| expr2text
| finput
| fprint
| fread
| funcenv
| input
| protocol
| read
| strprint
| write