1. 名前空間 `console^I
[`Exposed$=*] namespace `console@I { /* が、 下の名前空間~obj要件も見よ。 ◎ but see namespace object requirements below */ // ~log用 `undefined$ `assert$m(optional `boolean$ %condition = false, `any$... %data); `undefined$ `clear$m(); `undefined$ `debug$m(`any$... %data); `undefined$ `error$m(`any$... %data); `undefined$ `info$m(`any$... %data); `undefined$ `log$m(`any$... %data); `undefined$ `table$m(optional `any$ %tabularData, optional `sequence$<`DOMString$> %properties); `undefined$ `trace$m(`any$... %data); `undefined$ `warn$m(`any$... %data); `undefined$ `dir$m(optional `any$ %item, optional `object$? %options); `undefined$ `dirxml$m(`any$... %data); // 計数~用 `undefined$ `count$m(optional `DOMString$ %label = "default"); `undefined$ `countReset$m(optional `DOMString$ %label = "default"); // ~group分け `undefined$ `group$m(`any$... %data); `undefined$ `groupCollapsed$m(`any$... %data); `undefined$ `groupEnd$m(); // 計時 `undefined$ `time$m(optional `DOMString$ %label = "default"); `undefined$ `timeLog$m(optional `DOMString$ %label = "default", `any$... %data); `undefined$ `timeEnd$m(optional `DOMString$ %label = "default"); };
注記: 歴史的な理由から、 `console$I は小文字にされている。 ◎ For historical reasons, console is lowercased.
注記: 開発者~consoleが[ 開かれていない/存在しない ]場合でも、 `console$I は,~scriptからは[ 常に,可視かつ利用-可能 ]になることが重要である。 ◎ It is important that console is always visible and usable to scripts, even if the developer console has not been opened or does not exist.
歴史的な~web互換性の理由から、 `console$I 用の`名前空間~obj$の `Prototype^sl は, `ObjectPrototype$jI に代えて空な~objになるモノトスル — `ObjectCreate$A( `ObjectPrototype$jI ) により作成されたかのように。 ◎ For historical web-compatibility reasons, the namespace object for console must have as its [[Prototype]] an empty object, created as if by ObjectCreate(%ObjectPrototype%), instead of %ObjectPrototype%.
1.1. ~log用~関数
1.1.1. `assert(condition, ...data)^m
- ~IF[ %condition ~EQ ~T ] ⇒ ~RET ◎ If condition is true, return.
- %~message ~LET 整形~指定子を伴わない文字列であって, 表明の失敗を汎用的に指示するもの (例: `Assertion failed^l ) ◎ Let message be a string without any formatting specifiers indicating generically an assertion failure (such as "Assertion failed").
- ~IF[ %data は`空$である ] ⇒ %data に %~message を`付加する$ ◎ If data is empty, append message to data.
-
~ELSE: ◎ Otherwise:
- %先頭 ~LET %data[ 0 ] ◎ Let first be data[0].
- ~IF[ %先頭 は `String$jt でない ] ⇒ %data に %~message を`前付加する$ ◎ If first is not a String, then prepend message to data.
- ~ELSE ⇒ %data[ 0 ] ~SET 次を順に`連結する$ ⇒# %~message, `003A^U (:), `0020^U ~SPACE, %先頭 ◎ Otherwise: • Let concat be the concatenation of message, U+003A (:), U+0020 SPACE, and first. • Set data[0] to concat.
- `Logger$A( `assert^l, %data ) ◎ Perform Logger("assert", data).
1.1.2. `clear()^m
- 適切な`~group~stack$を`空にする$ ◎ Empty the appropriate group stack.
- 環境にて可能なら,~consoleを~clearする(他の場合,何もしない) ◎ If possible for the environment, clear the console. (Otherwise, do nothing.)
1.1.3. `debug(...data)^m
- `Logger$A( `debug^l, %data ) ◎ Perform Logger("debug", data).
1.1.4. `error(...data)^m
- `Logger$A( `error^l, %data ) ◎ Perform Logger("error", data).
1.1.5. `info(...data)^m
- `Logger$A( `info^l, %data ) ◎ Perform Logger("info", data).
1.1.6. `log(...data)^m
- `Logger$A( `log^l, %data ) ◎ Perform Logger("log", data).
1.1.7. `table(tabularData, properties)^m
~tableを構築するよう試行した上で, `~log~level$【!%logLevel】 `log^l の下で~logする — ~tableの[ 各列は、 %tabularData の各~propからなる(または %properties を利用する)/ 各行は、 %tabularData からなる ]。 表構造として構文解析できなかった場合、 単に引数を~logすることに~fall-backする。 ◎ Try to construct a table with the columns of the properties of tabularData (or use properties) and rows of tabularData and log it with a logLevel of "log". Fall back to just logging the argument if it can’t be parsed as tabular.
未策定 — これには良い~algoが必要になる。 ◎ TODO: This will need a good algorithm.
1.1.8. `trace(...data)^m
- %~trace ~LET [ この関数を~callした所からの~callstack ]の表現 — `実装定義$な, 何らかの, 対話的にもなり得るような ◎ Let trace be some implementation-defined, potentially-interactive representation of the callstack from where this function was called.
- 任意選択で ⇒ %~trace 用の~labelとして[ `Formatter$A( %data ) の結果 ]を組入れる ◎ Optionally, let formattedData be the result of Formatter(data), and incorporate formattedData as a label for trace.
- `Printer$A( `trace^l, « %~trace » ) ◎ Perform Printer("trace", « trace »).
注記: ~stack~trace内に~printされる関数の識別子は、 `実装定義$である。 それはまた、 `new Error().stack^c 内に見られるものと同じ識別子になることは保証されない。 ◎ The identifier of a function printed in a stack trace is implementation-defined. It is also not guaranteed to be the same identifier that would be seen in new Error().stack.
1.1.9. `warn(...data)^m
- `Logger$A( `warn^l, %data ) ◎ Perform Logger("warn", data).
1.1.10. `dir(item, options)^m
- %~obj ~LET %item に`汎用~JS~objの整形$を適用した結果 ◎ Let object be item with generic JavaScript object formatting applied.
- `Printer$A( `dir^l, « %~obj », %options ) ◎ Perform Printer("dir", « object », options).
1.1.11. `dirxml(...data)^m
- %最終-~list ~LET 新たな`~list$ ◎ Let finalList be a new list, initially empty.
-
%data を成す ~EACH( %~item ) に対し: ◎ For each item of data:
- %変換-済み ~LET %~item の~DOM~tree表現が可能ならば それ / ~ELSE_ %~item に`最適に有用な整形$を適用した結果 ◎ Let converted be a DOM tree representation of item if possible; otherwise let converted be item with optimally useful formatting applied.
- %最終-~list に %変換-済み を付加する ◎ Append converted to finalList.
- `Logger$A( `dirxml^l, %最終-~list ) ◎ Perform Logger("dirxml", finalList).
1.2. 計数~用~関数
各 `console$I 名前空間~objには、 `計数~map@ が結付けられる。 それは、 各~entryが[ `文字列$ → 数 ]として与えられる`~map$であり, 初期~時は空とする。 ◎ Each console namespace object has an associated count map, which is a map of strings to numbers, initially empty.
1.2.1. `count(label)^m
- %~map ~LET コレの`計数~map$ ◎ Let map be the associated count map.
- ~IF[ %~map[ %label ] ~NEQ ε ] ⇒ %~map[ %label ] ~INCBY 1 ◎ If map[label] exists, set map[label] to map[label] + 1.
- ~ELSE ⇒ %~map[ %label ] ~SET 1 ◎ Otherwise, set map[label] to 1.
- %連結結果 ~LET 次を順に`連結する$ ⇒# %label, `003A^U (:), `0020^U ~SPACE, `ToString$A( %~map[ %label ] ) ◎ Let concat be the concatenation of label, U+003A (:), U+0020 SPACE, and ToString(map[label]).
- `Logger$A( `count^l, « %連結結果 » ) ◎ Perform Logger("count", « concat »).
1.2.2. `countReset(label)^m
- %~map ~LET コレの`計数~map$ ◎ Let map be the associated count map.
- ~IF[ %~map[ %label ] ~NEQ ε ] ⇒ %~map[ %label ] ~SET 0 ◎ If map[label] exists, set map[label] to 0.
-
~ELSE: ◎ Otherwise:
- %~message ~LET 整形~指定子を伴わない文字列であって,[ %label【!the given label】 には計数は結付けられてないこと ]を汎用的に指示するもの ◎ Let message be a string without any formatting specifiers indicating generically that the given label does not have an associated count.
- `Logger$A( `countReset^l, « %~message » ) ◎ Perform Logger("countReset", « message »);
1.3. ~group分け関数
`~group@ は、 `実装定義$な, 対話的にもなり得る, 親より字下げ~levelが 1 つ深い, 出力~用の~viewであり、 `Printer$A の~callにより生産される。 各 `console$I 名前空間~objには、 `~group~stack@ が結付けられる — それは、 `~stack$であり, 初期~時は空とする。 `~group~stack$内の最後の`~group$のみが[ `Printer$A の~callにより生産される出力 ]を~hostすることになる。 ◎ A group is an implementation-defined, potentially-interactive view for output produced by calls to Printer, with one further level of indentation than its parent. Each console namespace object has an associated group stack, which is a stack, initially empty. Only the last group in a group stack will host output produced by calls to Printer.
1.3.1. `group(...data)^m
- %~group ~LET 新たな`~group$ ◎ Let group be a new group.
- %~group~label ~LET [ %data は`空$でないならば `Formatter$A( %data ) の結果 / ~ELSE_ 実装により選ばれる[ `~group$を表現する~label ]] ◎ If data is not empty, let groupLabel be the result of Formatter(data). Otherwise, let groupLabel be an implementation-chosen label representing a group.
- %~group~label を %~group 用の~labelとして組入れる ◎ Incorporate groupLabel as a label for group.
- 任意選択で ⇒ ~IF[ 環境は対話的~groupを~supportする ] ⇒ %~group は既定で展開されるべきである ◎ Optionally, if the environment supports interactive groups, group should be expanded by default.
- `Printer$A( `group^l, « %~group » ) ◎ Perform Printer("group", « group »).
- 適切な`~group~stack$に %~group を`~push$する ◎ Push group onto the appropriate group stack.
1.3.2. `groupCollapsed(...data)^m
- %~group ~LET 新たな`~group$ ◎ Let group be a new group.
- %~group~label ~LET [ %data は空でないならば `Formatter$A( %data ) の結果 / ~ELSE_ 実装により選ばれる[ `~group$を表現する~label ]] ◎ If data is not empty, let groupLabel be the result of Formatter(data). Otherwise, let groupLabel be an implementation-chosen label representing a group.
- %~group~label を %~group 用の~labelとして組入れる ◎ Incorporate groupLabel as a label for group.
- 任意選択で ⇒ ~IF[ 環境は対話的~groupを~supportする ] ⇒ %~group は既定で畳まれるべきである ◎ Optionally, if the environment supports interactive groups, group should be collapsed by default.
- `Printer$A( `groupCollapsed^l, « %~group » ) ◎ Perform Printer("groupCollapsed", « group »).
- 適切な`~group~stack$に %~group を`~push$する ◎ Push group onto the appropriate group stack.
1.3.3. `groupEnd()^m
- `~group~stack$から`~pop$する ◎ Pop the last group from the group stack.
1.4. 計時~関数
各 `console$I 名前空間~objには `~timer~table@ が結付けられる。 それは、 各~entryが[ `文字列$ → 時刻 ]として与えられる`~map$であり, 初期~時は空とする。 ◎ Each console namespace object has an associated timer table, which is a map of strings to times, initially empty.
1.4.1. `time(label)^m
- %~timer~table ~LET コレの`~timer~table$ ◎ ↓
-
~IF[ %~timer~table[ %label ] ~NEQ ε ]:
- 任意選択で ⇒ [ ~label %label を伴う~timerは、 すでに開始された ]ことを指示する警告を~consoleに報告する
- ~RET
- ~ELSE ⇒ %~timer~table[ %label ] ~SET 現在の時刻 ◎ Otherwise, set the value of the entry with key label in the associated timer table to the current time.
1.4.2. `timeLog(label, ...data)^m
- %~timer~table ~LET コレの`~timer~table$ ◎ Let timerTable be the associated timer table.
- %開始~時刻 ~LET %~timer~table[ %label ] ◎ Let startTime be timerTable[label].
-
%時間長 ~LET `実装定義$な書式で ( 現在の時刻 ~MINUS %開始~時刻 ) を表現している文字列 ◎ Let duration be a string representing the difference between the current time and startTime, in an implementation-defined format.
`4650^l, `4650.69 ms^l, `5 seconds^l, `00:05^l は、 どれも 4650.69 ミリ秒間を表示する適理な仕方である。 ◎ "4650", "4650.69 ms", "5 seconds", and "00:05" are all reasonable ways of displaying a 4650.69 ms duration.
- %連結結果 ~LET 次を順に`連結する$ ⇒# %label, `003A^U (:), `0020^U ~SPACE, %時間長 ◎ Let concat be the concatenation of label, U+003A (:), U+0020 SPACE, and duration.
- %data に %連結結果 を`前付加する$ ◎ Prepend concat to data.
- `Printer$A( `timeLog^l, %data ) ◎ Perform Printer("timeLog", data).
利用者が[ 何らかの余分な~dataを伴う中間的な~timer~log ]を給し易くするため、 ~timerが存続する限り, `timeLog()$m の~callに渡す %data ~parameterは `Logger$A の~callに含まれる。 例えば: ◎ The data parameter in calls to timeLog() is included in the call to Logger to make it easier for users to supply intermediate timer logs with some extra data throughout the life of a timer. For example:
console.time("MyTimer"); console.timeLog("MyTimer", "Starting application up…"); /* 何らかの — たぶん,複階的な~appを~bootstrapするような — ~codeが走る。 ◎ Perhaps some code runs to bootstrap a complex app */ // ... console.timeLog("MyTimer", "UI is setup, making API calls now"); /* 何らかの — たぶん,~appを それ用の~dataで埋めるような — `fetch()^c をここで行う。 ◎ Perhaps some fetch()'s here filling the app with data */ // ... console.timeEnd("MyTimer");
1.4.3. `timeEnd(label)^m
- %~timer~table ~LET コレの`~timer~table$ ◎ Let timerTable be the associated timer table.
- %開始~時刻 ~LET %~timer~table[ %label ] ◎ Let startTime be timerTable[label].
- %~timer~table[ %label ] ~SET ε ◎ Remove timerTable[label].
- %時間長 ~LET `実装定義$な書式で ( 現在の時刻 ~MINUS %開始~時刻 ) を表現している文字列 ◎ Let duration be a string representing the difference between the current time and startTime, in an implementation-defined format.
- %連結結果 ~LET 次を順に`連結する$ ⇒# %label, `003A^U (:), `0020^U ~SPACE, %時間長 ◎ Let concat be the concatenation of label, U+003A (:), U+0020 SPACE, and duration.
- `Printer$A( `timeEnd^l, « %連結結果 » ) ◎ Perform Printer("timeEnd", « concat »).
%~timer~table 内に所与の %label が存在しないときに, `timeEnd()$m, `timeLog()$m が正式に警告を~consoleに報告させる計画については、 課題 #134 を見よ。 ◎ See whatwg/console#134 for plans to make timeEnd() and timeLog() formally report warnings to the console when a given label does not exist in the associated timer table.
2. 抽象-演算の~support法
2.1. `Logger^A( %logLevel, %args )
`Logger^A 演算は、 ( `~log~level$ %logLevel, 他の引数たちが成す`~list$ %args ) を受容する。 その主な出力を成すのは、 `実装定義$な,結果を~consoleへ~printする副作用である。 この仕様は、 そうする間に整形-指定子をどう処理するかについて述べる。 ◎ The logger operation accepts a log level and a list of other arguments. Its main output is the implementation-defined side effect of printing the result to the console. This specification describes how it processes format specifiers while doing so.
- ~IF[ %args は`空$である ] ⇒ ~RET ◎ If args is empty, return.
- %先頭 ~LET %args[ 0 ] ◎ Let first be args[0].
- %残り ~LET %args 内の %先頭 に後続するすべての要素からなる`~list$ ◎ Let rest be all elements following first in args.
- ~IF[ %残り は`空$である ] ⇒# `Printer$A( %logLevel, « %先頭 » ); ~RET ◎ If rest is empty, perform Printer(logLevel, « first ») and return.
- ~ELSE ⇒ `Printer$A( %logLevel, `Formatter$A( %args ) ) ◎ Otherwise, perform Printer(logLevel, Formatter(args)).
- ~RET `undefined^jv 【 ~RET と ~RET `undefined^jv の違いは?】 ◎ Return undefined.
注記: ~algoが返る前に~printされることが重要である。 多くの開発者~consoleは、 その中に手入力した最後の演算の結果を~printする。 そのような~consoleにおいては、 開発者が `console.log("hello!")^c と手入力したとき, 先ず `hello!^l, 次に `console.log^c ~callの返り値 `undefined^jv を~printすることになる。 ◎ It’s important that the printing occurs before returning from the algorithm. Many developer consoles print the result of the last operation entered into them. In such consoles, when a developer enters console.log("hello!"), this will first print "hello!", then the undefined return value from the console.log call.
2.2. `Formatter^A( %args )
`Formatter^A 演算は、 供された 1 個目の引数を[ 他の引数を利用して整形する ]よう試行する。 それは、[ 1 個目の引数~内の整形~指定子が尽きるか, 他の引数が尽きる ]まで入力を整形するよう試行した上で, ~print用に相応しい~objたちが成す`~list$を返す: ◎ The formatter operation tries to format the first argument provided, using the other arguments. It will try to format the input until no formatting specifiers are left in the first argument, or no more arguments are left. It returns a list of objects suitable for printing.
- ~IF[ %args の`~size$ ~EQ 1 ] ⇒ ~RET %args ◎ If args’s size is 1, return args.
- %~target ~LET %args の 1 個目の要素 ◎ Let target be the first element of args.
- %current ~LET %args の 2 個目の要素 ◎ Let current be the second element of args.
-
%指定子 ~LET %~target 内に未処理な†整形-指定子は[ 在るならば,それらのうち最初に現れるもの/ 無いならば ε ] ◎ Find the first possible format specifier specifier, from the left to the right in target.
【† “未処理な” は、 この訳による追加。 さもなければ、 同じ整形-指定子を何度も繰り~~返すことにもなり得るので。 】
- ~IF[ %指定子 ~EQ ε ] ⇒ ~RET %args ◎ If no format specifier was found, return args.
-
%変換-済み ~LET %指定子 に応じて,次で与えられる値: ◎ Otherwise:
- `%s^l
- `Call$A( `String$jI, `undefined^jv, « %current » ) ◎ If specifier is %s, let converted be the result of Call(%String%, undefined, « current »).
- `%d^l
- `%i^l
- %current に応じて ⇒# `Symbol$jt であるならば `NaN^jv / ~ELSE_ `Call$A( `parseInt$jI, `undefined^jv, « %current, 10 » ) ◎ If specifier is %d or %i: • If current is a Symbol, let converted be NaN • Otherwise, let converted be the result of Call(%parseInt%, undefined, « current, 10 »).
- `%f^l
- %current に応じて ⇒# `Symbol$jt であるならば `NaN^jv / ~ELSE_ `Call$A( `parseFloat$jI, `undefined^jv, « %current » ) ◎ If specifier is %f: • If current is a Symbol, let converted be NaN • Otherwise, let converted be the result of Call(%parseFloat%, undefined, « current »).
- `%o^l
- 任意選択で、 次のいずれか ⇒# %指定子 / %current に`最適に有用な整形$を適用した結果 ◎ If specifier is %o, optionally let converted be current with optimally useful formatting applied.
- `%O^l
- 任意選択で、 次のいずれか ⇒# %指定子 / %current に`汎用~JS~objの整形$を適用した結果 ◎ If specifier is %O, optionally let converted be current with generic JavaScript object formatting applied.
- `%c^l
- (未策定) ◎ TODO: process %c
- %~target 内の %指定子 を %変換-済み に置換する 【 %変換-済み 内にも整形-指定子があった場合、その指定子も “未処理” と見なされるのか?】 ◎ If any of the previous steps set converted, replace specifier in target with converted.
- %結果 ~LET %~target, および %args 内の 3 個目~以降の要素からなる`~list$ ◎ Let result be a list containing target together with the elements of args starting from the third onward.
- ~RET `Formatter$A( %結果 ) ◎ Return Formatter(result).
2.2.1. 各種 整形~指定子の要約
上の~algoにて処理される各種 整形-指定子を,以下に要約する(規範的でない): ◎ The following is an informative summary of the format specifiers processed by the above algorithm.
指定子 | 目的 | 型~変換 |
---|---|---|
`%s^l | %要素 を文字列に変換する | `String$jI( %要素 ) |
`%d^l / `%i^l | %要素 を整数に変換する | `parseInt$jI( %要素, 10 ) |
`%f^l | %要素 を浮動小数点数に変換する | `parseFloat$jI( %要素, 10 ) |
`%o^l | %要素 を`最適に有用な整形$で表示する | 可用でない |
`%O^l | %要素 を`汎用~JS~objの整形$で表示する | 可用でない |
`%c^l | %要素 に供された~CSSを適用する | 可用でない |
2.3. `Printer^A( %logLevel, %args[, %options] )
`Printer^A 演算は、 `実装定義$であり,次を受容する ⇒# 厳しさを指示する`~log~level$ %logLevel, ~printする引数~群を与える~List %args, 実装に特有な整形~optionを与える省略可能な~obj %options ◎ The printer operation is implementation-defined. It accepts a log level indicating severity, a List of arguments to print, and an optional object of implementation-specific formatting options.\
%args 内に現れる要素は、 次に挙げるいずれかになる: ◎ Elements appearing in args will be one of the following:
- ~JS~obj — 型を問わず ◎ JavaScript objects of any type.
- ~print可能なもの — ~stack~traceや`~group$など — を成す,実装に特有な表現 ◎ Implementation-specific representations of printable things such as a stack trace or group.
- `汎用~JS~objの整形$を適用した結果の~obj ◎ Objects with either generic JavaScript object formatting\
- `最適に有用な整形$を適用した結果の~obj ◎ or optimally useful formatting applied.
%options ~objが渡され,それは[ `undefined^jv / `null^jv ]でない場合、 実装は, %options を利用して %args 内の各~要素に`実装定義$な整形を適用してもヨイ。 ◎ If the options object is passed, and is not undefined or null, implementations may use options to apply implementation-defined formatting to the elements in args.
実装が %args をどう~printするかは,実装に委ねられるが、 実装は,開発者の期待に沿うよう[ ~objどうしを~spaceかそれに類する何かで分離する ]べきである。 ◎ How the implementation prints args is up to the implementation, but implementations should separate the objects by a space or something similar, as that has become a developer expectation.
`Printer^A 演算が~callされる時点では、 すべての整形-指定子は織り込み済みであり,[ 整形-指定子により消費されるものと意味された引数たち ]は %args 内には残されないことになる。 実装の仕事は、 単純に~Listを~printすることである。 `Printer^A の~callにより生産される出力が現れるのは、[ 適切な`~group~stack$が空でなければ それ成す最後の`~group$の中に限られる/ 他の場合は~console内の他所になる ]べきである。 ◎ By the time the printer operation is called, all format specifiers will have been taken into account, and any arguments that are meant to be consumed by format specifiers will not be present in args. The implementation’s job is simply to print the List. The output produced by calls to Printer should appear only within the last group on the appropriate group stack if the group stack is not empty, or elsewhere in the console otherwise.
`Printer^A 演算の~call時に,~consoleが開かれていない場合、 実装は,~messageたちを`実装定義$な上限(概して,少なくとも何百個か)までは — それらを未来に示すために — ~bufferするべきである。 ◎ If the console is not open when the printer operation is called, implementations should buffer messages to show them in the future up to an implementation-defined limit (typically on the order of at least 100).
2.3.1. ~logの厳しさ~levelの指示-法
`console$I の各~関数は、 各自に一意な値を[ `Printer^A の~call時の %logLevel ~parameter ]に利用する — それにより、 ~printする~messageを関数ごとに~custom化することを実装に許容する。 しかしながら、[ これらの関数を次の表tに要約される 4 ~groupに分けて, 同じ~groupに属する出力は同様に扱う ]ことも,共通的に実施されている: ◎ Each console function uses a unique value for the logLevel parameter when calling Printer, allowing implementations to customize each printed message depending on the function from which it originated. However, it is common practice to group together certain functions and treat their output similarly, in four broad categories. This table summarizes these common groupings:
~group | `console$I 関数 | 記述 |
---|---|---|
log | `log()$m, `trace()$m, `dir()$m, `dirxml()$m, `group()$m, `groupCollapsed()$m, `debug()$m, `timeLog()$m | 汎用な~log |
info | `count()$m, `info()$m, `timeEnd()$m | 参考~log |
warn | `warn()$m, `countReset()$m | ~messageにより指示される何かを利用者~向けに警告する~log |
error | `error()$m, `assert()$m | 利用者~向けに~errorを指示する~log |
この~group分けに意味されるのは,共通的な実施を文書化することであり、[ 各~関数~用に,次の例に見られるような特別な挙動を供すること ]に関して,実装を拘束することではない: ◎ These groupings are meant to document common practices, and do not constrain implementations from providing special behavior for each function, as in the following examples:
ここに見られる ある実装は、 `timeEnd()$m への~callにより生産される出力を青くすることにした — `info()$m による出力は より中立的な色のままにしつつ。 ◎ Here you can see one implementation chose to make output produced by calls to timeEnd() blue, while leaving info() a more neutral color.
`count()$m の~callは、[ 常に,新たな出力を~printする ]とは限らず,[ 以前に出力した計数を更新する ]こともある。 ◎ Calls to count() might not always print new output, but instead could update previously-output counts.
2.3.2. `Printer^A ~UX新機軸
`Printer$A は`実装定義$なので、 その実装には,~UX(利用者~体験)における新機軸も共通的に見られる。 ~UXの増補として,例えば次が挙げられるが、 これらに限られない: ◎ Since Printer is implementation-defined, it is common to see UX innovations in its implementations. The following is a non-exhaustive list of potential UX enhancements:
-
~spamを防止するため、 互いに一致する出力は一つに集約する。 ◎ De-duplication of identical output to prevent spam.
この例の実装は、 互いに一致する複数の~messageを一括するのみならず, 何個の~messageが一緒に一括されたかも供する。 ◎ In this example, the implementation not only batches multiple identical messages, but also provides the number of messages that have been batched together.
-
~messageたちを~logの厳しさ~levelで絞込むことを利用者に許容するための、 脇に置かれる余分な~UI。 ◎ Extra UI off to the side allowing the user to filter messages by log level severity.
- [ `~timer~table$, `~group~stack$, その他の内部に保守される~data ]の現在の状態を指示するための,脇に置かれる余分な~UI。 ◎ Extra UI off to the side indicating the current state of the timer table, group stack, or other internally maintained data.
- ~consoleのある部位を明滅して,利用者に何か重要なことを~alertする。 ◎ Flashing portions of the console to alert the user of something important.
2.3.3. 共通的な~obj整形-
~objは概して、 その文脈に相応しく整形されて~printされることになる。 この節では、 ~objたちが各自の文脈にて最も有用に整形されるような,共通的な仕方を述べる。 この節に述べる整形は、[ 最終的に `Printer$A に渡されることになる,`実装定義$な~obj表現 ]に適用されることに注意。 整形による実際の副作用は,そこで見えることになる。 ◎ Typically objects will be printed in a format that is suitable for their context. This section describes common ways in which objects are formatted to be most useful in their context. It should be noted that the formatting described in this section is applied to implementation-defined object representations that will eventually be passed into Printer, where the actual side effect of formatting will be seen.
`汎用~JS~objの整形@ を伴う~objとは、 汎用~JS~objの[ 展開-可能にもなり得る表現 ]である。 `最適に有用な整形@ を伴う~objとは、 ~objの[ 対話的にもなり得る`実装定義$な表現 ]であって,最大限に有用かつ参考になると判定されたものである。 ◎ An object with generic JavaScript object formatting is a potentially expandable representation of a generic JavaScript object. An object with optimally useful formatting is an implementation-defined, potentially-interactive representation of an object judged to be maximally useful and informative.
2.3.4. 例: Node.js における `Printer^A
Node.js ~platform上で `Printer^A 演算を実装する最も単純な仕方は、 それまでに整形された引数~群を~spaceで分離して連結した結果の出力を[ `stdout^c / `stderr^c ]に書込むことである。 ◎ The simplest way to implement the printer operation on the Node.js platform is to join the previously formatted arguments separated by a space and write the output to stdout or stderr.
`ECMASCRIPT$r を利用する Node.js における実装~例: ◎ Example implementation in Node.js using [ECMASCRIPT]:
const %util = require('util'); function print(%logLevel, ...%args) { const %message = %util.format(...%args); if (%logLevel === 'error') { process.stderr.write(%message + '\n'); } else if (%logLevel === 'log' || %logLevel === 'info' || %logLevel === 'warn') { process.stdout.write(%message + '\n'); } }
ここでの `util.format^c 関数により たくさんの作業が行われる。 それは、 入子な~objを文字列~化して,文字列でない引数は読める文字列~versionに変換する。 例えば `undefined^jv は 文字列 `undefined^l に, `false^jv は `false^l になる: ◎ Here a lot of the work is done by the util.format function. It stringifies nested objects, and converts non-string arguments into a readable string version, e.g. undefined becomes the string "undefined" and false becomes "false":
print('log', 'duck', [{foo: 'bar'}]); // prints: `duck [ { foo: 'bar' } ]\n^c on stdout print('log', 'duck', false); // prints: `duck false\n^c on stdout print('log', 'duck', undefined); // prints: `duck undefined\n^c on stdout
2.4. ~consoleへの警告の報告-法
`~consoleに警告を報告する@ ときは、 所与の ( 警告の汎用な記述 %記述 ) に対し,実装は次の手続きを走らすモノトスル: ◎ To report a warning to the console given a generic description of a warning description, implementations must run these steps:
- %警告 ~LET %記述 から導出される`実装定義$な文字列 ◎ Let warning be an implementation-defined string derived from description.
- `Printer$A( `reportWarning^l, « %警告 » ) ◎ Perform Printer("reportWarning", « warning »).