Unicode variable names: Difference between revisions

m
→‎{{header|Wren}}: Changed to Wren S/H
m (→‎{{header|Wren}}: Changed to Wren S/H)
 
(128 intermediate revisions by 76 users not shown)
Line 1:
{{task|Unicode}}{{omit from|BBC BASIC}}
 
;Task:
# Describe, and give a pointer to documentation on your languages use of characters ''beyond'' those of the ASCII character set in the naming of variables.
# Show how to:
Line 6 ⟶ 8:
:* Print its value.
 
 
;Cf.:
;Related task:
* [[Case-sensitivity of identifiers]]
<br><br>
 
=={{header|11l}}==
{{trans|Python}}
 
<syntaxhighlight lang="11l">V Δx = 1
Δx++
print(Δx)</syntaxhighlight>
 
{{out}}
<pre>
2
</pre>
 
=={{header|8th}}==
''Text in 8th is stored in the UTF-8 encoding, which means that the text is always represented correctly, even when due to other issues (e.g. font problems) it may appear incorrect.
 
''To make the programmer’s task easier, 8th not only lets you actually enter any UTF-8 text, it also lets you use special “escapes” in your text to make it easier to enter obscure characters. Thus, for example, this string: "qu\u00e9" results in this: qué.
 
''The words (e.g. “functions”) 8th provides to do string manipulation are also UTF-8 aware, which means you don’t have to worry about creating an invalid bit of UTF-8 encoded text (unless you deliberately do so).''
 
-- [http://8th-dev.com/local.html Writing localized applications with 8th]
 
<syntaxhighlight lang="forth">
1 var, Δ
 
Δ @ n:1+ Δ !
 
Δ @ . cr
 
\ unicode silliness
 
: 念 ' G:@ w:exec ;
: 店 ' G:! w:exec ;
: ਵਾਧਾ ' n:1+ w:exec ;
: الوداع ' G:bye w:exec ;
: キャリッジリターン ' G:cr w:exec ;
: प्रिंट ' G:. w:exec ;
 
Δ 念 ਵਾਧਾ Δ 店
 
Δ 念 प्रिंट キャリッジリターン
الوداع
 
</syntaxhighlight>
 
=={{header|ACL2}}==
Variables in ACL2 cannot be modified in place.
<langsyntaxhighlight Lisplang="lisp">(let ((Δ 1))
(1+ Δ))</langsyntaxhighlight>
 
=={{header|Ada}}==
As of Ada 2005, all source code can be made of up to 32bit characters.
Unless you have made it a default, GNAT would require the -gnatW8 flag to understand you are using UTF8 for the code below, other encodings are possible.
<langsyntaxhighlight Adalang="ada">with Ada.Text_IO;
procedure main is
Δ : Integer;
Line 24 ⟶ 72:
Δ := Δ + 1;
Ada.Text_IO.Put_Line (Δ'Img);
end main;</langsyntaxhighlight>
{{out}}
<pre> 42</pre>
 
=={{header|ALGOL 68}}==
The definition of Algol 68 is character set independent. Not only variables may be represented in Unicode, all other language elements may be so represented. All that is required is that the representation language must be capable of being translated unambigously back and forth into the reference language.
 
The following excerpt from the Revised Report states this:
 
----
 
d) A '''program''' in the strict language must be represented in some "representation language"
{9.3.a} chosen by the implementer. In most cases this will be the official "reference
language".
 
(i) A '''program''' in a representation language is obtained by replacing the '''symbols''' of a
'''program''' in the strict language by certain typographical marks {9 .3}.
 
(ii) Even the reference language allows considerable discretion to the implementer
{9.4.a,b,c}. A restricted form of the reference language in which such freedom has
not been exercised may be termed the "canonical form" of the language, and it is expected
that this form will be used in algorithms intended for publication.
 
(iii) The meaning of a '''program''' in a representation language is the same as that of the
'''program''' {in the strict language} from which it was obtained
 
----
 
The great majority of implementations have used EBCDIC, ASCII and an encoding of Cyrillic (precise encoding not known to me).
[[wp:ALGOL_68]] gives as an example:
 
''Russian/Soviet example: In English Algol68's reverent case statement reads '''case''' ~ '''in''' ~ '''out''' ~ '''esac''', in Cyrillic this reads '''выб''' ~ '''в''' ~ '''либо''' ~ '''быв'''.''
 
=={{header|AppleScript}}==
 
In AppleScript, identifiers whose first and last characters are vertical bars (|) can contain any characters. The AppleScript Language Guide doesn't recommend their use as they can make scripts difficult to read, but they're perfectly legal.
 
<syntaxhighlight lang="applescript">set |Δ| to 1
set |Δ| to |Δ| + 1
return |Δ|</syntaxhighlight>
 
{{output}}
<syntaxhighlight lang="applescript">2</syntaxhighlight>
 
Vertical bars can also be used to differentiate between identifiers and reserved words should the need arise. The bars are just a signal to the compiler to accept what's between them as an identifier and aren't stored with the identifier itself. They may disappear once the code's compiled if the decompiler can't see a reason to include them. Or indeed they may be added if a script compiled on one machine is decompiled on another where one of the identifiers clashes with a term defined in a library or OSAX installed on that machine.
 
=={{header|Arturo}}==
 
Arturo doesn't support words with non-ASCII characters.
 
However, you can set/get a variable with any name defined as a Unicode string, using the functions <code>let</code> (or its alias <code>:</code>) and <code>var</code>.
 
<syntaxhighlight lang="rebol">"Δ": 1
"Δ": inc var "Δ"
 
print ["Delta =>" var "Δ"]</syntaxhighlight>
 
{{out}}
 
<pre>Delta => 2</pre>
 
=={{header|AutoHotkey}}==
Line 32 ⟶ 137:
Documentation: http://www.autohotkey.net/~Lexikos/AutoHotkey_L/docs/Variables.htm
{{works with|AutoHotkey_L}}
<langsyntaxhighlight lang="ahk">Δ = 1
Δ++
MsgBox, % Δ</langsyntaxhighlight>
 
=={{header|BaCon}}==
This is a port from the C example. As mentioned there, C has limited support for Unicode variable names which is specified in the C standard, and BaCon, being a Basic-to-C converter, therefore has the same restrictions. The below example works with the CLang compiler.
<syntaxhighlight lang="qbasic">PRAGMA COMPILER clang
 
DECLARE Δ TYPE int
 
Δ = 1
 
INCR Δ
 
PRINT Δ</syntaxhighlight>
{{out}}
<pre>
user@host $ bacon prog
Converting 'prog.bac'... done, 10 lines were processed in 0.008 seconds.
Compiling 'prog.bac'... clang -c prog.bac.c
clang -o prog prog.bac.o -lbacon -lm
Done, program 'prog' ready.
user@host $ ./prog
2
</pre>
 
=={{header|Bracmat}}==
Bracmat allows any sequence of non-zero bytes as symbol and therefore, as variable name. Even the empty string is a variable, though a special one. If a symbol/variable name contains characters that have special meaning (operators, prefixes, parentheses, braces and the semicolon) it may be necessary to enclose it in quotes. Other special characters must be escaped C-style. See bracmat.html in the git-repo. The example below requires a terminal that supports UTF-8 encoded characters.
<syntaxhighlight lang="bracmat">( (Δ=1)
& 1+!Δ:?Δ
& out$("Δ:" !Δ)
);</syntaxhighlight>
Output:
<pre>Δ: 2</pre>
 
=={{header|C}}==
C has limited support for Unicode in variable names since C99, seewhere the UCS escaped form is required but raw Unicode characters are optional. See Annex D of the [http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf C standard] and [https://en.cppreference.com/w/c/language/identifier cppreference].
 
Most modern compilers, as of 2020, support raw Unicode identifiers, given the file is encoded properly (typically UTF-8).
 
<syntaxhighlight lang="c">// Works for clang and GCC 10+
#include<stdio.h>
 
int main() {
int Δ = 1; // if unsupported, use \u0394
Δ++;
printf("%d",Δ);
return 0;
}</syntaxhighlight>
Output:
<pre>
2
</pre>
 
=={{header|C sharp|C#}}==
Section 2.4.2 of the [http://go.microsoft.com/fwlink/?LinkId=199552 C# Language Specification] gives rules for identifiers. They correspond exactly to those recommended by the [http://unicode.org/reports/tr31/ Unicode Standard Annex 31], except that underscore is allowed as an initial character (as is traditional in the C programming language), Unicode escape sequences are permitted in identifiers, and the "@" character is allowed as a prefix to enable keywords to be used as identifiers.
<langsyntaxhighlight lang="csharp">class Program
{
static void Main()
Line 49 ⟶ 201:
System.Console.WriteLine(Δ);
}
}</langsyntaxhighlight>
{{out}}
<pre>2</pre>
 
=={{header|C++}}==
The C++ language allows the use of Unicode variable names.
 
For more information visit: https://en.cppreference.com/w/cpp/language/character_literal,
 
https://en.cppreference.com/w/cpp/language/identifiers and https://learnmoderncpp.com/2021/03/24/a-unicode-primer/
<syntaxhighlight lang="c++">
#include <cstdint>
#include <iostream>
#include <string>
 
int main() {
uint32_t Δ = 1;
double π = 3.14159;
std::string 你好 = "Hello";
Δ++;
std::cout << Δ << " :: " << π << " :: " << 你好 << std::endl;
}
</syntaxhighlight>
{{ out }}
<pre>
2 :: 3.14159 :: Hello
</pre>
 
=={{header|Clojure}}==
According to the current [http://clojure.org/reader documentation], one should stick to naming with alphanumeric characters and *, +, !, -, _, and ? to avoid possible problems if future versions of Clojure decide to apply special meaning to a character.
 
That being said, it is not currently enforced, so while you probably shouldn't, you technically can.
 
<syntaxhighlight lang="clojure">(let [Δ 1]
(inc Δ))</syntaxhighlight>
{{out}}
<pre>2</pre>
 
=={{header|Common Lisp}}==
<langsyntaxhighlight lang="lisp">(let ((Δ 1))
(incf Δ))</langsyntaxhighlight>
{{out}}
<pre>2</pre>
 
=={{header|Crystal}}==
<syntaxhighlight lang="crystal">Δ = 1
Δ += 1
puts Δ</syntaxhighlight>
{{out}}
<pre>2</pre>
Line 61 ⟶ 254:
=={{header|D}}==
D source files support four character encodings: ASCII, UTF-8, UTF-16 and UTF-32.
<langsyntaxhighlight lang="d">import std.stdio;
 
void main() {
Line 67 ⟶ 260:
Δ++;
writeln(Δ);
}</langsyntaxhighlight>
{{out}}
<pre>2</pre>
Line 85 ⟶ 278:
=={{header|Delphi}}==
For more information about naming identifiers (including variables) visit: [http://docwiki.embarcadero.com/RADStudio/en/Identifiers Identifiers in Delphi]
<langsyntaxhighlight Delphilang="delphi">(* Compiled with Delphi XE *)
program UnicodeVariableName;
 
Line 101 ⟶ 294:
Writeln(Δ);
Readln;
end.</langsyntaxhighlight>
 
=={{header|DWScript}}==
<langsyntaxhighlight Delphilang="delphi">var Δ : Integer;
 
Δ := 1;
Inc(Δ);
PrintLn(Δ);</langsyntaxhighlight>
 
=={{header|Déjà Vu}}==
<syntaxhighlight lang="dejavu">set :Δ 1
set :Δ ++ Δ
!. Δ</syntaxhighlight>
 
=={{header|EchoLisp}}==
Symbol names can be any string including unicode characters. See the EchoLisp [http://www.echolalie.org/echolisp/help.html#language reference] documentation.
<syntaxhighlight lang="lisp">
(define ∆-🍒 1) → ∆-🍒
(set! ∆-🍒 (1+ ∆-🍒)) → 2
(printf "🔦 Look at ∆-🍒 : %d" ∆-🍒)
🔦 Look at ∆-🍒 : 2
</syntaxhighlight>
 
=={{header|Elena}}==
ELENA 6.x:
<syntaxhighlight lang="elena">public program()
{
var Δ := 1;
Δ := Δ + 1;
console.writeLine(Δ)
}</syntaxhighlight>
 
=={{header|Emacs Lisp}}==
<syntaxhighlight lang="lisp">(setq Δ 1)
(setq Δ (1+ Δ))
(message "Δ is %d" Δ)</syntaxhighlight>
 
Variables are symbols and symbol names can be any string. Source code <code>.el</code> files can have all usual Emacs coding system specifications to give variables in non-ASCII.
 
The byte compiler writes <code>utf-8</code> (or past versions wrote <code>emacs-mule</code>) into <code>.elc</code> so that any mixture of non-ASCII is preserved.
 
=={{header|F_Sharp|F#}}==
As with C# the [http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html#_Toc207705761 F# Language Specification] refers to [http://www.unicode.org/reports/tr31/#Default_Identifier_Syntax Unicode Standard Annex #31] for identifier syntax, allowing Unicode letter characters.
<syntaxhighlight lang="fsharp">let mutable Δ = 1
Δ <- Δ + 1
printfn "%d" Δ</syntaxhighlight>
 
=={{header|Factor}}==
Variable names can contain any character, inlcuding unicode characters, as long as they don't parse as a string or a number.
<syntaxhighlight lang="factor">USE: locals
[let
1 :> Δ!
Δ 1 + Δ!
Δ .
]</syntaxhighlight>
 
=={{header|Forth}}==
Historically, Forth has worked only in ASCII (going so far as to reserve the eighth bit for symbol smudging), but some more modern implementations have(e.g., extendedGforth) characterallow setUTF-8 supportin suchword asnames, UTF-8strings and comments.
<syntaxhighlight lang="forth">variable ∆
{{works with|GNU Forth}} 0.7.0
1 ∆ !
<lang forth>variable ∆
51+!
∆ @ .</langsyntaxhighlight>
 
=={{header|FreeBASIC}}==
FreeBASIC does not allow non-ASCII characters in variable names or identifiers generally.
 
The only ASCII characters allowed are numerals (0-9), letters (a-z, A-Z) and the underscore(_).
 
However, identifiers cannot begin with a numeral.
 
If one wanted to use a Greek character such as Δ for a variable name, it would therefore have to be spelled out :
 
<syntaxhighlight lang="freebasic">'FB 1.05.0 Win64
 
Var delta = 1
delta += 1
Print delta '' 2
Sleep</syntaxhighlight>
 
=={{header|Frink}}==
Frink can use Unicode variable names that meet certain constraints. Variable names that don't meet these constraints can still be parsed and displayed by specifying them as Unicode escapes: [https://frinklang.org/#UnicodeInFrink Unicode Variable Names]
<syntaxhighlight lang="frink">
Δ = 1
Δ = Δ + 1
println[Δ]
</syntaxhighlight>
 
=={{header|Go}}==
Go source encoding is [http://golang.org/doc/go_spec.html#Source_code_representation specified] to be UTF-8. Allowable variable names are specified in the sections [http://golang.org/doc/go_spec.html#Identifiers identifiers] and [http://golang.org/doc/go_spec.html#Exported_identifiers Exported identifiers].
<langsyntaxhighlight lang="go">package main
 
import "fmt"
Line 127 ⟶ 392:
Δ++
fmt.Println(Δ)
}</langsyntaxhighlight>
{{out}}
<pre>
2
</pre>
 
=={{header|Groovy}}==
The Groovy solution for [[Arithmetic/Complex#Groovy|Arithmetic/Complex]] demonstrates a number of Unicode variable names
 
=={{header|Haskell}}==
Line 137 ⟶ 405:
 
Also, Haskell does not allow mutable variables, so incrementing delta isn't possible. Instead lower case psi was used to store the incremented value of delta since tridents are cool.
<langsyntaxhighlight Haskelllang="haskell">main = print ψ
where δΔ = 1
ψ = δΔ + 1</langsyntaxhighlight>
 
=={{Header|Insitux}}==
 
<syntaxhighlight lang="insitux">
(let Δ😄 1)
(inc Δ😄)
</syntaxhighlight>
 
{{out}}
 
<pre>
2
</pre>
 
=={{header|J}}==
Line 151 ⟶ 432:
 
=={{header|Java}}==
<langsyntaxhighlight lang="java">int Δ = 1;
double π = 3.141592;
String 你好 = "hello";
Δ++;
System.out.println(Δ);</langsyntaxhighlight>
{{out}}
<pre>
2
</pre>
 
=={{header|JavaScript}}==
<syntaxhighlight lang="javascript">var ᾩ = "something";
var ĦĔĽĻŎ = "hello";
var 〱〱〱〱 = "too less";
var जावास्क्रिप्ट = "javascript"; // ok that's JavaScript in hindi
var KingGeorgeⅦ = "Roman numerals.";
 
console.log([ᾩ, ĦĔĽĻŎ, 〱〱〱〱, जावास्क्रिप्ट, KingGeorgeⅦ])</syntaxhighlight>
{{out}}
<pre>
["something", "hello", "too less", "javascript", "Roman numerals."]
</pre>
 
=={{header|jq}}==
Apart from the initial "$", the characters allowed in so-called "$ variables" in jq are restricted to alphanumeric characters and the underscore: [A-Za-z0-9_].
 
However, in practice, the keys of JSON objects can also be used as variable names. For example, in the following expression, "Δ" is in effect set to 1 and then its value is retrieved in the environment in which "Δ" has been set:
<syntaxhighlight lang="jq">{ "Δ": 1 } | .["Δ"]</syntaxhighlight>
 
In jq 1.5 and later, <syntaxhighlight lang="jq">.["Δ"]</syntaxhighlight> can be abbreviated to <syntaxhighlight lang="jq">."Δ"</syntaxhighlight>
 
Strictly speaking, variables in jq cannot be incremented (in fact, strictly speaking, jq does not have variables at all), but the equivalent operation is illustrated here:
 
<syntaxhighlight lang="jq">{ "Δ": 1 } # initialization
| .["Δ"] += 1 # increment by 1
| .["Δ"] # emit the incremented value</syntaxhighlight>
 
=={{header|Julia}}==
The Julia documentation on
[http://docs.julialang.org/en/latest/manual/variables/#allowed-variable-names allowed variable names] explicitly describes the wide variety of Unicode codepoints that are allowed:
<syntaxhighlight lang="julia">julia> Δ = 1 ; Δ += 1 ; Δ
2</syntaxhighlight>
The allowed identifiers also include sub/superscripts and combining characters (e.g. accent marks):
<syntaxhighlight lang="julia">julia> Δ̂₂ = Δ^2
4</syntaxhighlight>
and the Julia interactive shells (and many editors) allow typing these symbols via tab-completion of their LaTeX abbreviations.
 
=={{header|Kotlin}}==
<syntaxhighlight lang="scala">fun main(args: Array<String>) {
var Δ = 1
Δ++
print(Δ)
}</syntaxhighlight>
 
{{out}}
<pre>
2
</pre>
 
=={{header|Lily}}==
<syntaxhighlight lang="lily">var Δ = 1
Δ += 1
print(Δ.to_s())</syntaxhighlight>
 
=={{header|Lingo}}==
Since version 11, in Lingo/Director both native strings and scripts use UTF-8 encoding. Variable names support Unicode characters:
<syntaxhighlight lang="lingo">Δ = 1
Δ = Δ + 1
put Δ
-- 2</syntaxhighlight>
 
=={{header|LiveCode}}==
In LiveCode 7+ all characters are stored as unicode. This includes variable (container) names, although it does not seem to state this in the LC dictionary.
<syntaxhighlight lang="livecode">put 1 into Δ
add 1 to Δ
put Δ
-- result is 2</syntaxhighlight>
 
=={{header|LOLCODE}}==
The [http://lolcode.com/specs/1.2#variables spec] mandates that identifiers be alphanumeric. However, the fact that [http://lolcode.com/specs/1.2#strings YARNs] are Unicode-aware permits the use of the [http://lolcode.com/proposals/1.3/bukkit2#srs-serious-cast SRS operator] introduced in 1.3 to utilize variables of arbitrary name.
<langsyntaxhighlight LOLCODElang="lolcode">I HAS A SRS "Δ" ITZ 1
SRS "Δ" R SUM OF SRS ":(394)" AN 1
VISIBLE SRS ":[GREEK CAPITAL LETTER DELTA]"</langsyntaxhighlight>
{{out}}
<pre>2</pre>
 
=={{header|Lua}}==
Lua 5.3 supports UTF-8 encoding as documented here: https://www.lua.org/manual/5.3/manual.html#6.5 .
<lang Lua>local unicode = {}
However, this support is not strictly necessary for this task so long as the Lua script is edited using a UTF-8 enabled text editor.
unicode["Für"] = "for"
<syntaxhighlight lang="lua">∆ = 1
print(unicode["Für"])
∆ = ∆ + 1
print(∆)</syntaxhighlight>
{{out}}
<pre>2</pre>
This output was produced using LuaJIT, which implements Lua 5.1. This works because although Lua doesn't 'understand' the delta character, it still resolves to a consistent set of bytes. This string is "Γêå" in ASCII but the programmer does not need to be aware of that; the unicode variable name works just like any other.
 
=={{header|M2000 Interpreter}}==
unicode["garçon"] = "boy"
case is not significant
print(unicode["garçon"])
The language has Greek statements too
 
<syntaxhighlight lang="m2000 interpreter">
unicode["∆"]=1
Δ=1
print(unicode["∆"])</lang>
Δ++
Print Δ
ᾩ=3
Print ᾩ**2=ᾩ^2, ᾩ^2-1=8
Τύπωσε ᾩ**2=ᾩ^2, ᾩ^2-1=8 ' this is Print statement too
Print ᾡ=3
जावास्क्रिप्ट=100
जावास्क्रिप्ट++
Print "जावास्क्रिप्ट=";जावास्क्रिप्ट
ĦĔĽĻŎ$="hello"
Print ĦĔĽĻŎ$+ħĕľļŏ$="hellohello"
〱〱〱〱$="too less"
Print Left$(〱〱〱〱$, 3)="too"
 
c͓͈̃͂̋̈̆̽h̥̪͕ͣ͛̊aͨͣ̍͞ơ̱͔̖͖̑̽ș̻̥ͬ̃̈ͩ =100 : Print "c͓͈̃͂̋̈̆̽h̥̪͕ͣ͛̊aͨͣ̍͞ơ̱͔̖͖̑̽ș̻̥ͬ̃̈ͩ ="; c͓͈̃͂̋̈̆̽h̥̪͕ͣ͛̊aͨͣ̍͞ơ̱͔̖͖̑̽ș̻̥ͬ̃̈ͩ
=={{header|Mathematica}}==
 
<lang Mathematica>Δ = 1;
</syntaxhighlight>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<syntaxhighlight lang="mathematica">Δ = 1;
Δ++;
Print[Δ]</langsyntaxhighlight>
 
=={{header|Nemerle}}==
From the Nemerle [http://nemerle.org/wiki/index.php?title=Lexical_structure_%28ref%29 Reference Manual]: "Programs are written using the Unicode character set, using the UTF-8 encoding."
<syntaxhighlight lang="nemerle">using System.Console;
 
module UnicodeVar
{
Main() : void
{
mutable Δ = 1;
Δ++;
WriteLine($"Δ = $Δ");
}
}</syntaxhighlight>
 
=={{header|NetRexx}}==
The ''NetRexx Language Definition'' section of the NetRexx documentation ([http://netrexx.org/files/nrl3.pdf netrexx.org/files/nrl3.pdf]) describes the character set support within the language.
<langsyntaxhighlight NetRexxlang="netrexx">/* NetRexx */
options replace format comments java crossref symbols nobinary
 
Line 220 ⟶ 606:
 
return
</syntaxhighlight>
</lang>
'''Output:'''
<pre>
Line 232 ⟶ 618:
</pre>
 
=={{header|NimrodNim}}==
From the spec: httphttps://build.nimrodnim-codelang.org/docs/manual.html#lexical-analysis-identifiers-amp-keywords
 
<langsyntaxhighlight Nimrodlang="nimrod">var Δ = 1
Δ.inc() Δ
echo( Δ)</langsyntaxhighlight>
 
=={{header|Objeck}}==
As of 3.2, Objeck supports UTF-8 encoded I/O and stores characters in the runtime's native Unicode format.
<lang objeck>
<syntaxhighlight lang="objeck">
class Test {
function : Main(args : String[]) ~ Nil {
Line 250 ⟶ 637:
}
}
</syntaxhighlight>
</lang>
 
=={{header|Ol}}==
Ol fully supports Unicode.
 
<syntaxhighlight lang="scheme">
(define Δ 1)
(define Δ (+ Δ 1))
(print Δ)
</syntaxhighlight>
 
{{out}}
<pre>
2
</pre>
 
=={{header|PARI/GP}}==
Line 256 ⟶ 657:
 
PARI supports Unicode variable names only insofar as [[#C|C]] does.
 
=={{header|Peloton}}==
{{incomplete|Peloton}}
1. (working on it)
2.
<syntaxhighlight lang="sgml"><@ LETVARLIT>Δ|1</@>
<@ ACTICRVAR>Δ</@>
<@ SAYVAR>Δ</@></syntaxhighlight>
Using what Google Translate says is the Traditional Chinese for 'delta'
<syntaxhighlight lang="sgml"><@ LETVARLIT>三角洲|1</@>
<@ ACTICRVAR>三角洲</@>
<@ SAYVAR>三角洲</@></syntaxhighlight>
 
=={{header|Perl}}==
Requires Perl 5.8.1 at the minimum. See http://perldoc.perl.org/utf8.html
 
See http://perldoc.perl.org/utf8.html
<langsyntaxhighlight lang="perl">use utf8;
 
my $Δ = 1;
$Δ++;
print $Δ, "\n";</langsyntaxhighlight>
One can have Unicode in identifier names, but not in package/class or subroutine names. While some limited functionality towards this does exist as of Perl 5.8.0, that is more accidental than designed; use of Unicode for the said purposes is unsupported.
 
<code>$</code> sigil can be omitted by using [http://perldoc.perl.org/perlsub.html#Lvalue-subroutines lvalue] subroutine:
One reason of this unfinishedness is its (currently) inherent unportability: since both package names and subroutine names may need to be mapped to file and directory names, the Unicode capability of the filesystem becomes important-- and there unfortunately aren't portable answers.
 
<syntaxhighlight lang="perl">use utf8;
=={{header|Perl 6}}==
Perl 6 is written in Unicode so, with narrow restrictions, nearly any Unicode letter can be used in identifiers.
 
BEGIN {
See Perl 6 Synopsis 02. - http://perlcabal.org/syn/S02.html#Names
my $val;
<lang perl6>my $Δ = 1;
sub Δ () : lvalue {
$Δ++;
$val;
say $Δ;</lang>
}
Function and subroutine names can also use Unicode characters: (as can methods, classes, packages, whatever...)
}
<lang perl6>my @ᐁ = (0, 45, 60, 90);
 
subΔ π= { pi }1;
Δ++;
print Δ, "\n";</syntaxhighlight>
 
or with Perl 5.10 and [http://perldoc.perl.org/functions/state.html state] modifier:
sub postfix:<°>($degrees) { $degrees * π / 180 };
 
<syntaxhighlight lang="perl">use utf8;
for @ᐁ -> $ಠ_ಠ { say sin $ಠ_ಠ° };</lang>
use v5.10;
 
sub Δ () : lvalue {
state $val;
}
 
Δ = 1;
Δ++;
say Δ;</syntaxhighlight>
 
One can have Unicode in identifier or subroutine names and also in package or class names. Use of Unicode for the last two purposes is, due to file and directory names, dependent on the filesystem.
 
=={{header|Phix}}==
Phix does not officially support unicode variable names, however it took me less than 5 minutes (changes, which are now permanent, labelled with "for rosettacode/unicode" in ptok.e and pttree.e, setting charset and identset respectively) to get the following to work, as long as the source file is stored using utf8 with a proper BOM, as supported by Notepad and the included Edita. I will happily add further character ranges as required/requested: I simply don't know what those ranges are, but I believe that no code points in utf8 should overlap existing ascii chars such as +-* etc.
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">Δ</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
<span style="color: #000000;">Δ</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #0000FF;">?</span><span style="color: #000000;">Δ</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
2
</pre>
 
=={{header|PHP}}==
PHP is not made to support Unicode. UTF-16 (UCS-2) will not work because it adds null bytes before or after ASCII characters (depending on endianness of UTF-16). As every code has to start with <code>&lt;?php</code> (ASCII) exactly, the parser doesn't find the match and just prints <code>&lt;?php</code> mark.
 
UTF-8 uses ASCII values for bytes which can be represented as ASCII and as result it's possible to insert <code>&lt;?php</code> mark at beginning. PHP sees your document as some 8-bit encoding (like ISO-8859-1), but it doesn't matter because UTF-8 doesn't use ASCII ranges for its values and calls to the variable are consistent.
 
Documentation: [http://php.net/manual/en/mbstring.php4.req.php mbstring.php4.req], [http://php.net/manual/en/language.variables.basics.php language.variables.basics]
<syntaxhighlight lang="php"><?php
$Δ = 1;
++$Δ;
echo $Δ;</syntaxhighlight>
 
=={{header|PicoLisp}}==
Variables are usually [http://software-lab.de/doc/ref.html#internal-io Internal Symbols], and their names may contain any UTF-8 character except null-bytes. White space, and 11 special characters (see the reference) must be escaped with a backslash. [http://software-lab.de/doc/ref.html#transient-io Transient Symbols] are often used as variables too, they follow the syntax of strings in other languages.
<langsyntaxhighlight PicoLisplang="picolisp">: (setq Δ 1)
-> 1
: Δ
Line 293 ⟶ 743:
-> 2
: Δ
-> 2</langsyntaxhighlight>
 
=={{header|PHPPike}}==
<syntaxhighlight lang="pike">
PHP is not made to support Unicode. UTF-16 (UCS-2) will not work because it adds null bytes before or after ASCII characters (depending on endianness of UTF-16). As every code has to start with <code>&lt;?php</code> (ASCII) exactly, the parser doesn't find the match and just prints <code>&lt;?php</code> mark.
#charset utf8
void main()
{
int Δ = 1;
Δ++;
write( Δ +"\n");
}
</syntaxhighlight>
{{Out}}
<pre>
2
</pre>
 
=={{header|PowerShell}}==
UTF-8 uses ASCII values for bytes which can be represented as ASCII and as result it's possible to insert <code>&lt;?php</code> mark at beginning. PHP sees your document as some 8-bit encoding (like ISO-8859-1), but it doesn't matter because UTF-8 doesn't use ASCII ranges for its values and calls to the variable are consistent.
<syntaxhighlight lang="powershell">
$Δ = 2
$π = 3.14
$π*$Δ
</syntaxhighlight>
<b>Output:</b>
<pre>
6.28
</pre>
 
=={{header|Prolog}}==
Documentation: [http://php.net/manual/en/mbstring.php4.req.php mbstring.php4.req], [http://php.net/manual/en/language.variables.basics.php language.variables.basics]
<syntaxhighlight lang="prolog">% Unicode in predicate names:
<lang php><?php
是. % be: means, approximately, "True".
$Δ = 1;
不是 :- \+ 是. % not be: means, approximately, "False". Defined as not 是.
++$Δ;
echo $Δ;</lang>
 
% Unicode in variable names:
=={{header|Protium}}==
test(Garçon, Δ) :-
{{incomplete|Protium}}
Garçon = boy,
1. (working on it)
Δ = delta.
 
2.
% Call test2(1, Result) to have 2 assigned to Result.
<lang protium><@ LETVARLIT>Δ|1</@>
test2(Δ, R) :- R is Δ + 1.</syntaxhighlight>
<@ ACTICRVAR>Δ</@>
 
<@ SAYVAR>Δ</@></lang>
Putting this into use:
Using what Google Translate says is the Traditional Chinese for 'delta'
<syntaxhighlight lang="prolog">?- 是.
<lang protium><@ LETVARLIT>三角洲|1</@>
true.
<@ ACTICRVAR>三角洲</@>
 
<@ SAYVAR>三角洲</@></lang>
?- 不是.
false.
 
?- test(X,Y).
X = boy,
Y = delta.
 
?- test2(1,Result).
Result = 2.</syntaxhighlight>
 
=={{header|Python}}==
Line 325 ⟶ 804:
 
Identifiers are unlimited in length. Case is significant.
<langsyntaxhighlight lang="python">>>> Δx = 1
>>> Δx += 1
>>> print(Δx)
2
>>> </langsyntaxhighlight>
 
=={{header|R}}==
See <code>?assign</code> for details.
 
<syntaxhighlight lang="rsplus">f <- function(`∆`=1) `∆`+1
 
f(1)</syntaxhighlight>
{{out}}
<pre>[1] 2</pre>
 
=={{header|Racket}}==
Line 335 ⟶ 823:
Racket has virtually no restrictions on valid characters for identifiers. In particular, Unicode identifiers are supported.
 
<syntaxhighlight lang="racket">
<lang Racket>
#lang racket
 
Line 349 ⟶ 837:
(printf "Δ = ~s\n" Δ) ; prints "Δ = 2"
 
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
(formerly Perl 6)
Raku is written in Unicode so, with narrow restrictions, nearly any Unicode letter can be used in identifiers.
 
See the current Raku documentation on the topic here: https://docs.raku.org/language/syntax#Identifiers
<syntaxhighlight lang="raku" line>my $Δ = 1;
$Δ++;
say $Δ;</syntaxhighlight>
Function and subroutine names can also use Unicode characters: (as can methods, classes, packages, whatever...)
<syntaxhighlight lang="raku" line>my @ᐁ = (0, 45, 60, 90);
 
sub π { pi };
 
sub postfix:<°>($degrees) { $degrees * π / 180 };
 
for @ᐁ -> $ಠ_ಠ { say sin $ಠ_ಠ° };
 
sub c͓͈̃͂̋̈̆̽h̥̪͕ͣ͛̊aͨͣ̍͞ơ̱͔̖͖̑̽ș̻̥ͬ̃̈ͩ { 'HE COMES' }</syntaxhighlight>
<br>
 
'''See Also:'''<br>
[[Egyptian_division#More_.22Egyptian.22_version|Egyptian division]]
 
=={{header|Retro}}==
<syntaxhighlight lang="retro">'Δ var
This has been tested on Retro 11.0 running under OS X.
#1 !Δ
<lang Retro>variable Δ
@Δ n:put
1 !Δ
@&Δ putnv:inc
@Δ n:put</syntaxhighlight>
1 +Δ
 
@Δ putn</lang>
Function and variable names are stored as strings, and UTF-8 is usable, as long as the host system allows it.
 
=={{header|RubyREXX}}==
{{works with|R4 REXX}}
This task requires Ruby 1.9. Multilingualization, or m17n, is a major new feature of Ruby 1.9. With m17n, the identifiers can use the non-ASCII characters. Ruby is a Code Set Independent (CSI) language, so there are many different character encodings.
{{works with|ROO REXX}}
 
# Any non-ASCII characters require a '''magic comment''' to select the encoding.
# Ruby source code must be '''ASCII compatible'''. For example, SJIS and UTF-8 are ASCII compatible, but ISO-2022-JP and UTF-16LE are not compatible. So one can write the source file in UTF-8, but not in UTF-16LE.
 
Note: &nbsp; this REXX program &nbsp; ''only'' &nbsp; works with the &nbsp; '''R4''' &nbsp; or &nbsp; '''ROO''' &nbsp; REXX interpreter under DOS or DOS under Windows.
A more complete reference is [http://yokolet.blogspot.com/2009/07/design-and-implementation-of-ruby-m17n.html ''The design and implementation of Ruby M17N''].
 
This REXX program works because the &nbsp; '''R4''' &nbsp; and &nbsp; '''ROO''' &nbsp; REXX interpreters support an extended character set.
The next example uses a magic comment to select the Big5 encoding. Then it creates a local variable named Δ.
<syntaxhighlight lang="rexx">/*REXX program (using the R4 REXX interpreter) which uses a Greek delta char).*/
{{works with|Ruby|1.9}}
'chcp' 1253 "> NUL" /*ensure we're using correct code page.*/
<lang ruby># -*- coding: big5 -*-
Δ=1 /*define delta (variable name Δ) to 1*/
Δ = 1
Δ=Δ+1 /*bump the delta REXX variable by unity*/
say 'Δ=' Δ /*stick a fork in it, we're all done. */</syntaxhighlight>
'''output'''
<pre>
Δ= 2
</pre>
 
=={{header|Ring}}==
<syntaxhighlight lang="ring">
# Project : Unicode variable names
 
Δ = "Ring Programming Language"
see Δ + nl
</syntaxhighlight>
Output:
<pre>
Ring Programming Language
</pre>
 
=={{header|Ruby}}==
Ruby supports about 100 encodings, the default being UTF-8.
<syntaxhighlight lang="ruby">Δ = 1
Δ += 1
puts Δ # => 2</langsyntaxhighlight>
 
=={{header|Rust}}==
<pre>00000000 23 20 2d 2a 2d 20 63 6f 64 69 6e 67 3a 20 62 69 |# -*- coding: bi|
Rust source encoding is [https://doc.rust-lang.org/reference.html#input-format specified] to be UTF-8. [https://doc.rust-lang.org/reference.html#identifiers Identifiers] must begin with a character that has Unicode XID_start property and remaining characters must have the XID_Continue property. (Which means that [https://github.com/mozilla/rust/issues/7048#issuecomment-19254166 ╯°□°╯︵┻━┻] is not permitted under current specification)
00000010 67 35 20 2d 2a 2d 0a a3 47 20 3d 20 31 0a a3 47 |g5 -*-.Δ = 1.Δ|
00000020 20 2b 3d 20 31 0a 70 75 74 73 20 a3 47 0a | += 1.puts Δ.|
0000002e</pre>
The output is <code>2</code>.
One can also use the non-ASCII characters in a method name. The next example selects the EUC-JP encoding, and creates a method named ≦, with a parameter named ♯♭♪. Because ≦ is an ordinary method, not an operator, so the program must use a dot to call the method.
{{works with|Ruby|1.9}}
<lang ruby># -*- coding: euc-jp -*-
 
<b>Non-ASCII identifiers are [https://github.com/mozilla/rust/pull/10605 feature gated] since version 0.9</b>
class Numeric
def ≦(♯♭♪)
self <= ♯♭♪
end
end
 
<syntaxhighlight lang="rust">#![feature(non_ascii_idents)]
∞ = Float::INFINITY
#![allow(non_snake_case)]
±5 = [-5, 5]
 
p [(±5.first.≦ ∞),
fn main() {
(±5.last.≦ ∞),
let mut Δ: i32 = 1;
(∞.≦ ∞)]</lang>
Δ += 1;
<pre>00000000 23 20 2d 2a 2d 20 63 6f 64 69 6e 67 3a 20 65 75 |# -*- coding: eu|
println!("{}", Δ);
00000010 63 2d 6a 70 20 2d 2a 2d 0a 0a 63 6c 61 73 73 20 |c-jp -*-..class |
}</syntaxhighlight>
00000020 4e 75 6d 65 72 69 63 0a 20 20 64 65 66 20 a1 e5 |Numeric. def ≦|
 
00000030 28 a2 f4 a2 f5 a2 f6 29 0a 20 20 20 20 73 65 6c |(♯♭♪). sel|
=={{header|S-lang}}==
00000040 66 20 3c 3d 20 a2 f4 a2 f5 a2 f6 0a 20 20 65 6e |f <= ♯♭♪. en|
S-Lang documentation is decent, but there are imperfections, and this
00000050 64 0a 65 6e 64 0a 0a a1 e7 20 3d 20 46 6c 6f 61 |d.end..∞ = Floa|
is a case in point. The "Identifiers" chapter in the primary doc says
00000060 74 3a 3a 49 4e 46 49 4e 49 54 59 0a a1 de 35 20 |t::INFINITY.±5 |
that an identifier must start with [A-Za-z$_] followed by zero or more
00000070 3d 20 5b 2d 35 2c 20 35 5d 0a 70 20 5b 28 a1 de |= [-5, 5].p [(±|
of [A-Za-z0-9$_]. (The chapter is probably a holdover from S-Lang 1.)
00000080 35 2e 66 69 72 73 74 2e a1 e5 20 a1 e7 29 2c 0a |5.first.≦ ∞),.|
 
00000090 20 20 20 28 a1 de 35 2e 6c 61 73 74 2e a1 e5 20 | (±5.last.≦ |
But in reality, any non-ascii Unicode character is legal in identifiers,
000000a0 a1 e7 29 2c 0a 20 20 20 28 a1 e7 2e a1 e5 20 a1 |∞),. (∞.≦ |
including the first character, as long as it's encoded in UTF-8. [As an
000000b0 e7 29 5d 0a |)].|
aside, S-Lang includes iconv.sl to interface to the Gnu iconv library. The
000000b4</pre>
0.99.18 ms-win version of the S-Lang-powered [http://www.paneura.com/~dino/wjed.html#HISTORY Jed]
The output is <code>[true, true, true]</code> because the numbers -5, 5 and infinity are all less than or equal to infinity.
programmer's editor includes this to handle the UTF-16 files popular
with windows.]
 
The same document does give a hint in the "S-Lang 2 Interpreter NEWS"
appendix, which says "Native support for Unicode via UTF-8 throughout
the library" was added as of S-Lang 2.0.
 
As the doc isn't completely clear, I've used the requested non-ascii char
not just in variable but also function and reference names, and tested under
S-Lang versions 2.0.6 and pre2.3.1-23.
<syntaxhighlight lang="s-lang">define ∆increment(∆ref) {
@∆ref++;
}
variable foo∆bar = 1;
foo∆bar++;
variable ∆bar = 1;
∆bar++;
∆increment(&∆bar);
% foo∆bar should be 2 and ∆bar should be 3.
print(foo∆bar);
print(∆bar);
</syntaxhighlight>
{{out}}
2
3
 
=={{header|Scala}}==
<langsyntaxhighlight lang="scala">var Δ = 1
val π = 3.141592
val 你好 = "hello"
Δ += 1
println(Δ)</langsyntaxhighlight>
 
=={{header|SenseTalk}}==
<syntaxhighlight lang="sensetalk">put 1 into Δ
add 1 to Δ
put Δ</syntaxhighlight>
{{out}}
<pre>2</pre>
 
=={{header|Sidef}}==
<syntaxhighlight lang="ruby">var Δ = 1;
Δ += 1;
say Δ;</syntaxhighlight>
{{out}}
<pre>2</pre>
 
=={{header|Stata}}==
 
Here is how to create a macro, a scalar and a Mata variable named Δ:
 
<syntaxhighlight lang="stata">sca Δ=10
sca Δ=Δ+1
di Δ
 
local Δ=20
local ++Δ
di `Δ'
 
mata
Δ=30
Δ++
Δ
end</syntaxhighlight>
 
=={{header|Swift}}==
<syntaxhighlight lang="swift">var Δ = 1
let π = 3.141592
let 你好 = "hello"
Δ++
println(Δ)</syntaxhighlight>
{{out}}
<pre>
2
</pre>
 
=={{header|Tcl}}==
Tcl variable names can include any character <!-- but the <tt>::</tt> sequence is special — it is the namespace separator — and there are restrictions when parentheses are involved, as they are used for associative arrays; these are not matters that are in the spirit of this task though, so this is a comment! --> (the <code>$var</code> syntax can't, but that's just a shorthand for the operationally-equivalent <code>[set var]</code>). Also (in tcl 8.6, at least), the <code>${var}</code> syntax does work. Thus, this script is entirely legal:
<langsyntaxhighlight lang="tcl">set Δx 1
incr Δx
puts [set Δx]</lang>
puts ${Δx}</syntaxhighlight>
However, this script only works smoothly if the “<tt>Δ</tt>” character is in the system's default encoding (thankfully more common than it used to be, as more and more systems use UTF-8 or UTF-16 as their default encodings) so normal Tcl practice is to stick to ASCII for identifier names.
 
It is also possible to encode characters using a <tt>\u''XXXX''</tt> substitution (each <tt>''X''</tt> is a hexadecimal digit), thus the <code>Δx</code> could be replaced throughout above by <code>\u0394x</code>; the result is a variable with exactly the same name as before. Doing this allows a script to be written with just ASCII characters, which tends to maximize portability across platforms.
 
=={{header|UNIX Shell}}==
{{works with|zsh}}
<syntaxhighlight lang="bash">
Δ=1
Δ=`expr $Δ + 1`
echo $Δ
</syntaxhighlight>
{{out}}
<pre>2</pre>
=={{header|Vala}}==
Vala has limited support for Unicode in variable names. This limitation comes from its source-to-source compilation to C.
 
=={{header|VBA}}==
:''See [[Unicode variable names#Visual Basic|Visual Basic]]''
 
=={{header|Visual Basic}}==
{{works with|Visual Basic|4}}
{{works with|Visual Basic|5}}
{{works with|Visual Basic|6}}
<syntaxhighlight lang="vb">Sub Main()
Dim Δ As Integer
Δ=1
Δ=Δ+1
Debug.Print Δ
End Sub</syntaxhighlight>
{{out}}
<pre>2</pre>
 
=={{header|Wren}}==
The rules for identifiers are described [http://wren.io/syntax.html here] - basically they can contain letters, digits (not initially) or underscores but identifiers with leading underscores are reserved for field names.
 
Although it's perhaps not 100% clear from that description that only ASCII letters and digits are allowed, this in fact is the case as the following example shows.
 
The error description refers to the bytes in the UTF encoding of 'Δ' which can't appear (outside a string) in a Wren script.
<syntaxhighlight lang="wren">var a = 3
var b = 2
var delta = a - b // ok
var Δ = delta // not ok</syntaxhighlight>
 
{{out}}
<pre>
[./unicode_ident line 4] Error: Invalid byte 0xce.
[./unicode_ident line 4] Error: Invalid byte 0x94.
</pre>
 
{{libheader|Wren-trait}}
However, it is possible to simulate Unicode variable names to some extent by using the ''Var'' class in the above module which stores the names (which can be any valid string) in an internal map.
<syntaxhighlight lang="wren">import "./trait" for Var
 
Var["Δ"] = 1
Var["Δ"] = Var["Δ"] + 1
System.print(Var["Δ"])</syntaxhighlight>
 
{{out}}
<pre>
2
</pre>
 
=={{header|Zig}}==
 
'''Works with:''' 0.10.x, 0.11.x, 0.12.0-dev.1594+7048e9366
 
Links here refer to 0.10.1 documentation, but nothing changed in 0.11.0, and 0.12.0 is not released yet at the moment of writing.
 
Source code in Zig must be encoded in UTF-8, see [https://ziglang.org/documentation/0.10.1/#Source-Encoding this] page from language reference.
 
Zig supports non-conforming identifiers (that includes space, use non-English alphabet, shadow reserved keyword etc.) via @"" syntax. See [https://ziglang.org/documentation/0.10.1/#Identifiers this] page from language reference.
 
<syntaxhighlight lang="zig">const std = @import("std");
 
pub fn main() void {
var @"Δ": i32 = 1;
@"Δ" += 1;
std.debug.print("{d}\n", .{@"Δ"});
}</syntaxhighlight>
 
{{out}}
<pre>
2
</pre>
 
=={{header|zkl}}==
The short answer is zkl identifiers are a small subset of ASCII. This is enforced by the compiler. That said, the VM doesn't particularly care about names (although UTF-8 will cause sorting/etc issues). So ...
<syntaxhighlight lang="zkl">delta:="\U0394;"; // UTF-8 delta
klass:= // embryo(names, numFcns, numClasses, numParents, ...)
self.embryo(L("","",delta),0,0,0).cook();
klass.setVar(0,Ref(1)); // indirect set since delta not valid var name
klass.vars.println();
 
dv:=klass.setVar(0); // which actually gets the var, go figure
dv.inc(); // ie (*ptr)++
dv.value.println();</syntaxhighlight>
{{out}}
<pre>
L(L("Δ",Ref))
2
</pre>
{{omit from|6502 Assembly|Depends on the assembler, and variable names don't exist at runtime anyway.}}
{{omit from|68000 Assembly}}
{{omit from|8080 Assembly}}
{{omit from|8086 Assembly}}
{{omit from|AWK}}
{{omit from|BASIC}}
{{omit from|BBC BASIC}}
{{omit from|Bc}}
{{omit from|BLAST}}
{{omit from|C|No can do++}}
{{omit from|Dc}}
{{omit from|EasyLang}}
{{omit from|Erlang|Not yet but planned}}
{{omit from|Free Pascal}}
{{omit from|GUISS}}
{{omit from|Icon}}
{{omit from|Locomotive Basic}}
{{omit from|Lotus 123 Macro Scripting}}
{{omit from|Pascal}}
{{omit from|Sed}}
{{omit from|TUSCRIPT}}
{{omit from|Unicon}}
{{omit from|Z80 Assembly|Depends on the assembler, and variable names don't exist at runtime anyway.}}
{{omit from|UNIX Shell}}
{{omit from|ZX Spectrum Basic}}
9,482

edits