Type detection: Difference between revisions

m
→‎{{header|Wren}}: Changed to Wren S/H
No edit summary
m (→‎{{header|Wren}}: Changed to Wren S/H)
 
(7 intermediate revisions by 6 users not shown)
Line 18:
If not practical, show how the caller would coerce a type that can be passed to the library function.
<br><br>
 
=={{header|Arturo}}==
 
<syntaxhighlight lang="arturo">print type 2
print type "hello world"
print type [1 2 3]
 
print is? :integer 4
print is? :integer "hello world"
 
print is? :string "hello world"
print is? :string 7
 
print string? "boom"
print logical? true
print block? ["one" "two" "three"]</syntaxhighlight>
 
{{out}}
 
<pre>:integer
:string
:block
true
false
true
false
true
true
true</pre>
 
=={{header|ATS}}==
===Using garbage collection and '''datatype'''===
<langsyntaxhighlight lang="ats">#include "share/atspre_staload.hats"
 
datatype source_t =
Line 53 ⟶ 82:
print_text (source_t_string "This\nis a\ntext.\n");
print_text (source_t_FILEref f)
end</langsyntaxhighlight>
 
{{out}}
Line 98 ⟶ 127:
In this implementation, '''print_text''' consumes its argument; the argument’s value cannot be used again. However, the object wrapped in the '''source_vt''' might be reusable.
 
<langsyntaxhighlight lang="ats">#include "share/atspre_staload.hats"
 
dataviewtype source_vt =
Line 132 ⟶ 161:
| ~ Some_vt f => print_text (source_vt_FILEref f)
| ~ None_vt () => fprintln! (stderr_ref, "Failed to open the file.")
end</langsyntaxhighlight>
{{out}}
$ patscc -DATS_MEMALLOC_LIBC type_detection-postiats-2.dats && ./a.out
Line 175 ⟶ 204:
 
=={{header|AWK}}==
<syntaxhighlight lang="awk">
<lang AWK>
# syntax: TAWK -f TYPE_DETECTION.AWK
# uses Thompson Automation's TAWK 5.0c
Line 190 ⟶ 219:
exit(0)
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 205 ⟶ 234:
=={{header|C}}==
The closest C comes to meeting this task, short of building it into the compiler or accessing memory segments via pointers, which is not guaranteed to be portable, is the ctype.h header file. It is part of the C Standard Library and provides 11 methods for detecting the type of a character, out of which the following 7 called in the wrapper function below can be called to be unique. The function accepts a string, but it actually checks the first character. An if ladder is used instead of if-else so that all function calls which return a non-zero value for the character are satisfied and the information is printed.
<syntaxhighlight lang="c">
<lang C>
#include<stdio.h>
#include<ctype.h>
Line 238 ⟶ 267:
return 0;
}
</syntaxhighlight>
</lang>
Output, shown for multiple inputs, as well as single ones:
<pre>
Line 286 ⟶ 315:
 
===Dispatch by ''tagged union''===
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <stdbool.h>
#include <assert.h>
Line 339 ⟶ 368:
source.value.input_file = fopen ("type_detection-c.c", "r");
print_text (source);
}</langsyntaxhighlight>
{{out}}
$ cc type_detection-c.c && ./a.out
Line 401 ⟶ 430:
 
=={{header|C sharp|C#}}==
<langsyntaxhighlight lang="csharp">using System;
 
namespace TypeDetection {
Line 427 ⟶ 456:
}
}
}</langsyntaxhighlight>
{{out}}
<pre>The type of '5' is System.Int32
Line 441 ⟶ 470:
=={{header|C++}}==
{{trans|D}}
<langsyntaxhighlight lang="cpp">#include <iostream>
 
template <typename T>
Line 461 ⟶ 490:
std::cout << typeString(S{}) << '\n';
std::cout << typeString(nullptr) << '\n';
}</langsyntaxhighlight>
{{out}}
<pre>int
Line 474 ⟶ 503:
 
=={{header|Crystal}}==
<langsyntaxhighlight Rubylang="ruby">def print_type(x)
puts "Compile-time type of #{x} is #{typeof(x)}"
puts " Actual runtime type is #{x.class}" if x.class != typeof(x)
Line 490 ⟶ 519:
print_type({a: 1, b: 2})
print_type ->(x : Int32){ x+2 > 0 }
</syntaxhighlight>
</lang>
{{out}}
<pre>Compile-time type of 123 is Int32
Line 507 ⟶ 536:
 
=={{header|D}}==
<langsyntaxhighlight Dlang="d">import std.stdio;
 
auto typeString(T)(T _) {
Line 526 ⟶ 555:
writeln(typeString(S()));
writeln(typeString(null));
}</langsyntaxhighlight>
 
{{out}}
Line 540 ⟶ 569:
 
=={{header|F_Sharp|F#}}==
<langsyntaxhighlight lang="fsharp">
printfn "%A" (3.14.GetType())
let inline fN g=g.GetType()|>string
printfn "%s" (fN "Nigel")
printfn "%s" (fN 23)
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 554 ⟶ 583:
=={{header|Factor}}==
Using dynamic dispatch:
<syntaxhighlight lang="text">USING: arrays formatting io kernel math prettyprint sequences
strings ;
IN: rosetta-code.type-detection
Line 569 ⟶ 598:
{ 1 2 3 4 5 } myprint
123 myprint
3.1415 myprint</langsyntaxhighlight>
{{out}}
<pre>
Line 591 ⟶ 620:
Below I use ‘class(*)’. The ‘print_text’ subroutine is used to print a string, an array of strings, and an input file.
 
<langsyntaxhighlight lang="fortran">program input_type_detection_demo
implicit none
 
Line 652 ⟶ 681:
end subroutine print_text
 
end program input_type_detection_demo</langsyntaxhighlight>
 
{{out}}
Line 735 ⟶ 764:
(To use this mechanism in a library, one would want to use modules. Nevertheless, the program below illustrates the principle more simply.)
 
<langsyntaxhighlight lang="fortran">program type_detection_demo
 
implicit none
Line 786 ⟶ 815:
end subroutine print_text_file_unit
 
end program type_detection_demo</langsyntaxhighlight>
{{out}}
$ gfortran type_detection-fortran-2.f90 && ./a.out
Line 851 ⟶ 880:
 
end program type_detection_demo</pre>
 
=={{header|FreeBASIC}}==
<syntaxhighlight lang="vbnet">'Rosetta Code problem: https://rosettacode.org/wiki/Type_detection
'by Jjuanhdez, 02/2023
 
#macro typeDetector(arg)
#if TypeOf(foo) = TypeOf(Byte)
Print arg; " -> It's a Byte!"
#elseif TypeOf(foo) = TypeOf(Short)
Print arg; " -> It's a Short!"
#elseif TypeOf(foo) = TypeOf(Integer)
Print arg; " -> It's a Integer!"
#elseif TypeOf(foo) = TypeOf(LongInt)
Print arg; " -> It's a LongInt!"
#elseif TypeOf(foo) = TypeOf(UByte)
Print arg; " -> It's a UByte!"
#elseif TypeOf(foo) = TypeOf(UShort)
Print arg; " -> It's a UShort!"
#elseif TypeOf(foo) = TypeOf(UInteger)
Print arg; " -> It's a UInteger!"
#elseif TypeOf(foo) = TypeOf(ULongInt)
Print arg; " -> It's a ULongInt!"
#elseif TypeOf(foo) = TypeOf(Single)
Print arg; " -> It's a Single!"
#elseif TypeOf(foo) = TypeOf(Double)
Print arg; " -> It's a Double!"
#elseif TypeOf(foo) = TypeOf(integer ptr)
Print arg; " -> It's a Integer ptr!"
#elseif TypeOf(foo) = TypeOf(byte ptr)
Print arg; " -> It's a Byte ptr!"
#elseif TypeOf(foo) = TypeOf(String)
Print arg; " -> It's a String!"
#endif
#endmacro
 
'Var declares a variable whose type is implied from the initializer expression.
'Var foo = -6728 '' implicit integer
'Var foo = 1.985766472453666 '' implicit double
Var foo = "Rosetta Code" '' var-len string
 
typeDetector (foo)
Sleep</syntaxhighlight>
 
=={{header|Go}}==
Note that Go doesn't really have a character type. A single quoted character (such as 'd') is by default a ''rune'' (or 32 bit integer) literal representing its Unicode code-point.
<langsyntaxhighlight lang="go">package main
 
import "fmt"
Line 874 ⟶ 946:
showType(value)
}
}</langsyntaxhighlight>
 
{{out}}
Line 889 ⟶ 961:
{{trans|Icon}}
 
<langsyntaxhighlight lang="goaldi">procedure main() {
print_text("This\nis a\ntext.\n")
print_text(file("type_detection-goaldi.gd"))
Line 899 ⟶ 971:
file : while write(read(source))
}
}</langsyntaxhighlight>
 
{{out}}
Line 924 ⟶ 996:
See also [[#ObjectIcon|ObjectIcon]] and [[#Goaldi|Goaldi]].
 
<langsyntaxhighlight lang="icon">procedure main()
print_text("This\nis\na text.\n")
print_text(open("type_detection-icon.icn"))
Line 934 ⟶ 1,006:
"file" : while write(read(source))
}
end</langsyntaxhighlight>
{{out}}
$ icont -u -s type_detection-icon.icn && ./type_detection-icon
Line 956 ⟶ 1,028:
Presumably this satisfies the task requirements...
 
<langsyntaxhighlight Jlang="j"> echo 'one'
one
echo 1
1</langsyntaxhighlight>
 
=={{header|Java}}==
{{trans|Kotlin}}
<langsyntaxhighlight Javalang="java">public class TypeDetection {
private static void showType(Object a) {
if (a instanceof Integer) {
Line 982 ⟶ 1,054:
showType(true);
}
}</langsyntaxhighlight>
{{out}}
<pre>'5' is an integer
Line 1,028 ⟶ 1,100:
<code>typeof</code> function, and the function <code>isa</code> tests
whether an object is of that type.
<syntaxhighlight lang="julia">
<lang Julia>
 
julia> a = 1
Line 1,075 ⟶ 1,147:
true
 
</syntaxhighlight>
</lang>
 
=={{header|OASYS Assembler}}==
 
<langsyntaxhighlight lang="oasys_oaa">
; The following method checks if a global variable or property is an
; object type. Does not work with locals and arguments.
Line 1,090 ⟶ 1,162:
/>1RF ; It is clear
:>0RF ; It is not clear
</syntaxhighlight>
</lang>
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.0.6
fun showType(a: Any) = when (a) {
is Int -> println("'$a' is an integer")
Line 1,106 ⟶ 1,178:
showType('d')
showType(true)
}</langsyntaxhighlight>
 
{{out}}
Line 1,117 ⟶ 1,189:
 
=={{header|Lua}}==
<langsyntaxhighlight lang="lua">function writeValue(v)
local t = type(v)
if t == "number" then
Line 1,157 ⟶ 1,229:
end
 
main()</langsyntaxhighlight>
{{out}}
<pre>The value 42 is of type number
Line 1,170 ⟶ 1,242:
===Using a generic procedure===
All is done at compile time. The generated code depends on the type of the parameter. We accept here any type, but only provide code to display text from a string and from a file and we emit an error for the other types.
<langsyntaxhighlight Nimlang="nim">proc writeText[T](source: T) =
when T is string:
echo source
Line 1,180 ⟶ 1,252:
writeText("Hello world!")
writeText(stdin)
writeText(3) # Emit an error.</langsyntaxhighlight>
 
===Using variant objects===
We define a type “Source” which contains a discriminator (tag) which is used to define branches. The code to display the text contains a test on the tag. The only types allowed are those for which a tag value exists. Here, we defined two possible values: “kString” and “kFile”. The “type detection” is done at runtime, but these are not actual types but tag values.
<langsyntaxhighlight Nimlang="nim">type Kind = enum kString, kFile
 
type Source = object
Line 1,200 ⟶ 1,272:
 
s1.writeText()
s2.writeText()</langsyntaxhighlight>
 
=={{header|ObjectIcon}}==
{{trans|Icon}}
<langsyntaxhighlight lang="objecticon">import io
 
procedure main()
Line 1,216 ⟶ 1,288:
"object" : while write(source.read())
}
end</langsyntaxhighlight>
{{out}}
$ oit -s type_detection-oi.icn && ./type_detection-oi
Line 1,240 ⟶ 1,312:
Pascal has a plethora of dialects, and so I have tried to be as close to ''Algorithms + Data Structures = Programs'' (Wirth) style as I could figure out how, when using the Free Pascal Compiler.
 
<langsyntaxhighlight lang="pascal">program typedetectiondemo (input, output);
type
sourcetype = record case kind : (builtintext, filetext) of
Line 1,281 ⟶ 1,353:
printtext (source)
end
end.</langsyntaxhighlight>
 
{{out}}
Line 1,333 ⟶ 1,405:
The function <code>ref</code> takes a reference to a variable, via '\', and returns the type. Some of the more common are shown here.
In the cases where the value in question is already a reference (<code>$regex</code> and <code>$subref</code>) the '\' is not used.
<langsyntaxhighlight lang="perl">$scalar = 1;
@array = (1, 2);
%hash = ('a' => 1);
Line 1,347 ⟶ 1,419:
printf $fmt, '$regex', ref( $regex);
printf $fmt, '$reference', ref(\$reference);
printf $fmt, '$subref', ref( $subref);</langsyntaxhighlight>
{{out}}
<pre>$scalar is type: SCALAR
Line 1,359 ⟶ 1,431:
{{libheader|Phix/basics}}
Phix builtin type tests are: integer(), atom(), string(), sequence(), and object(). The latter returns true unless arg is unassigned, also notice that showtype never even attempts to set t to "object", since it is guaranteed to be one of the other four.
<!--<langsyntaxhighlight Phixlang="phix">-->
<span style="color: #008080;">procedure</span> <span style="color: #000000;">showtype</span><span style="color: #0000FF;">(</span><span style="color: #004080;">object</span> <span style="color: #000000;">o</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">t</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #004080;">atom</span><span style="color: #0000FF;">(</span><span style="color: #000000;">o</span><span style="color: #0000FF;">)?</span><span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span><span style="color: #0000FF;">(</span><span style="color: #000000;">o</span><span style="color: #0000FF;">)?</span><span style="color: #008000;">"integer"</span><span style="color: #0000FF;">:</span><span style="color: #008000;">"atom"</span><span style="color: #0000FF;">)</span>
Line 1,370 ⟶ 1,442:
<span style="color: #000000;">showtype</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"string"</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">showtype</span><span style="color: #0000FF;">({</span><span style="color: #000000;">5</span><span style="color: #0000FF;">,</span><span style="color: #000000;">7.5</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"string"</span><span style="color: #0000FF;">})</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 1,413 ⟶ 1,485:
=={{header|PowerShell}}==
In PowerShell everything is an object and all objects have the GetType() method:
<syntaxhighlight lang="powershell">
<lang PowerShell>
[string]$str = "123"
$str.GetType()
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 1,423 ⟶ 1,495:
True True String System.Object
</pre>
<syntaxhighlight lang="powershell">
<lang PowerShell>
[int]$int = $str -as [int]
$int.GetType()
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 1,462 ⟶ 1,534:
http://docs.racket-lang.org/ts-reference/type-ref.html
 
<langsyntaxhighlight lang="racket">#lang racket
 
(require racket/undefined)
Line 1,595 ⟶ 1,667:
(td ,(string-join (->type-names v) ", "))))
test-values)))))
</syntaxhighlight>
</lang>
 
{{out}}
Line 1,687 ⟶ 1,759:
Raku is a dynamic language that has gradual, duck typing. It provides introspection methods through its comprehensive MOP (Meta Object Protocol) making it easy to do type detection, subroutine signatures and multi-dispatch. Raku types have two general flavors: content types and container types. Different container types have varying restrictions on what sort of content they can contain and in return provide specialized methods to operate on those contents. Content types give the compiler hints on how to best handle the information, what storage requirements it may have, what operators will work with it, etc.
 
This is really a very broad and kind of hand-wavey overview of Raku types. For much more indepthin-depth coverage see: [http https://designdocs.raku.org/S02type.html#Built-In_Data_Types| Raku Design Documents Synopsis S02: Bits and Pieces: Built-In Data Types]
 
<syntaxhighlight lang="raku" perl6line>sub type ($t) { say $t.raku, "\tis type: ", $t.WHAT }
 
# some content types
Line 1,705 ⟶ 1,777:
my my-type $object;
 
$object.&type;</langsyntaxhighlight>
 
{{out}}
Line 1,737 ⟶ 1,809:
<br>strings can be classified by having certain characteristics, &nbsp; or in other words, ''types''.
<br>Characteristics of these &nbsp; ''types'' &nbsp; can overlap.
<langsyntaxhighlight lang="rexx">/*REXX program displays what "type" a variable is (based on the variable's value). */
signal on noValue /*trap for undefined REXX variables. */
y= 1938 ; call showType y /*╔═══════════════════════════════════╗*/
Line 1,780 ⟶ 1,852:
if datatype(x, 'S') then say @ "a REXX symbol."
say copies('▒', 50) /*a fence that is used as a separator. */
return</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the internal default data:}}
<pre>
Line 1,873 ⟶ 1,945:
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
# Project : Type detection
 
Line 1,879 ⟶ 1,951:
see "7.5 -> " + type(7.5) + nl
see "d -> " + type('d') + nl
</syntaxhighlight>
</lang>
Output:
<pre>
Line 1,896 ⟶ 1,968:
The compiler will require that all possible values are handled, even if it's as simple as a fallthrough <code>_ => unreachable!()</code> which causes the program to die in a memory-safe way.
 
<langsyntaxhighlight lang="rust">enum ExpectedTypes {
Int(i64),
UInt(u64),
Line 1,920 ⟶ 1,992:
}
}
}</langsyntaxhighlight>
 
Output:
Line 1,937 ⟶ 2,009:
As Rust allows you to implement your own traits on other people's types, this can be used to implement type detection.
 
<langsyntaxhighlight lang="rust">use std::error::Error;
use std::fs::File;
use std::io::{self,prelude::*};
Line 1,994 ⟶ 2,066:
 
Ok(())
}</langsyntaxhighlight>
 
Output:
Line 2,010 ⟶ 2,082:
Finally, while it's more limited than it appears, Rust does have some small degree of support for type introspection.
 
<langsyntaxhighlight lang="rust">use std::any::Any;
 
pub fn is_string(thing: &dyn Any) {
Line 2,023 ⟶ 2,095:
is_string(&"Hello, World!");
is_string(&5u16);
}</langsyntaxhighlight>
 
Output:
Line 2,030 ⟶ 2,102:
 
=={{header|Scala}}==
<langsyntaxhighlight lang="scala">object TypeDetection extends App {
def showType(a: Any) = a match {
case a: Int => println(s"'$a' is an integer")
Line 2,045 ⟶ 2,117:
println(s"\nSuccessfully completed without errors. [total ${scala.compat.Platform.currentTime - executionStart} ms]")
 
}</langsyntaxhighlight>
 
=={{header|Scheme}}==
<langsyntaxhighlight lang="scheme">(define (print-text source)
(cond ((string? source)
;; The source is a string.
Line 2,069 ⟶ 2,141:
(print-text '("Print\n" "a list\n" "of strings.\n"))
 
(call-with-input-file "type_detection-scheme.scm" print-text)</langsyntaxhighlight>
 
{{out}}
Line 2,104 ⟶ 2,176:
=={{header|Smalltalk}}==
Just send class to any object and ask the class for its name...
<langsyntaxhighlight lang="smalltalk">typeOf := [:anyObject |
e'arg is of type {anyObject class name} and prints itself as: "{anyObject printString}"' printCR
].
Line 2,127 ⟶ 2,199:
typeOf value: (SmallInteger >> #+).
[ 1 / 0 ] on:Error do:[:ex | typeOf value: ex ]. "catch the exception"
[ 1 fooBar ] on:Error do:[:ex | typeOf value: ex ].</langsyntaxhighlight>
{{out}}
<pre>arg is of type SmallInteger and prints itself as: "1234"
Line 2,154 ⟶ 2,226:
=={{header|VBA}}==
VBA has a built-in function TypeName (VarType returns a number), which can also recognize arrays.
<langsyntaxhighlight lang="vb">Public Sub main()
Dim c(1) As Currency
Dim d(1) As Double
Line 2,189 ⟶ 2,261:
Debug.Print TypeName(CStr(1))
Debug.Print TypeName(Worksheets(1))
End Sub</langsyntaxhighlight>{{out}}
<pre>Application
Boolean
Line 2,216 ⟶ 2,288:
=={{header|Visual Basic .NET}}==
{{works with|Visual Basic .NET|9.0+}}
<langsyntaxhighlight lang="vbnet">Module TypeDetection
 
Sub Main()
Line 2,230 ⟶ 2,302:
 
End Module
</syntaxhighlight>
</lang>
 
{{out}}
Line 2,240 ⟶ 2,312:
</pre>
 
=={{header|V (Vlang)}}==
<syntaxhighlight lang="v (vlang)">fn show_type<T>(a T) {
println('The type of $a is ${typeof(a).name}')
}
Line 2,251 ⟶ 2,323:
show_type(`s`)
show_type([0x32,0x22])
}</langsyntaxhighlight>
 
{{out}}
Line 2,261 ⟶ 2,333:
The type of [50, 34] is []int
</pre>
 
=={{header|VBScript}}==
<syntaxhighlight lang="vb">
i = 1
ii=0.23
s = "Hello world"
a = split("Hello World"," ")
b=Array(i,ii,s,a)
Set c=CreateObject("Scripting.dictionary")
Class d
Private a,b
End Class
Set e=New d
 
 
WScript.Echo TypeName(b)
WScript.Echo TypeName(b(0))
WScript.Echo TypeName(b(1))
WScript.Echo TypeName(b(2))
WScript.Echo TypeName(b(3))
WScript.Echo TypeName(b(3)(0))
WScript.Echo TypeName(c)
WScript.Echo TypeName(e)
</syntaxhighlight>
{{out}}
<small>
<pre>
Variant()
Integer
Double
String
Variant()
String
Dictionary
d
</pre>
</small>
 
=={{header|Wren}}==
{{libheader|Wren-fmt}}
<langsyntaxhighlight ecmascriptlang="wren">import "./fmt" for Fmt
 
var showType = Fn.new { |obj|
Line 2,271 ⟶ 2,380:
 
var a = [4, 3.728, [1, 2], { 1: "first" }, true, null, 1..6, "Rosetta"]
a.each { |e| showType.call(e) }</langsyntaxhighlight>
 
{{out}}
Line 2,286 ⟶ 2,395:
 
=={{header|Z80 Assembly}}==
<langsyntaxhighlight lang="z80">PrintChar equ &BB5A ;Amstrad CPC BIOS Call
 
org &8000
Line 2,386 ⟶ 2,495:
byte 1,&46
TestBCD:
byte 2,&99</langsyntaxhighlight>
 
{{out}}
Line 2,398 ⟶ 2,507:
 
=={{header|zkl}}==
<langsyntaxhighlight lang="zkl">fcn processText(data_or_fileName){ // unknown
if (data_or_fileName.isType(String)) // == .isType("")
data_or_fileName=File(data_or_fileName,"rb").read(); //-->Data
Line 2,404 ⟶ 2,513:
doTheActualTextProcessing(text);
}
fcn doTheActualTextProcessing(text){ println(text) }</langsyntaxhighlight>
If an int is passed in, (123).text --> "123", other objects might throw an exception.
 
How to use:
<langsyntaxhighlight lang="zkl">processText("foo.txt");
processText(Data(Void,"This is some text"));
// fake up a class that holds a string:
cs:=class{ var text }; cs.text="this is more text";
processText(cs);</langsyntaxhighlight>
{{out}}
<pre>
9,476

edits