Whitespace (programming language): Difference between revisions

Content deleted Content added
m History: grammar
No edit summary
Tags: Mobile edit Mobile web edit Advanced mobile edit
 
(36 intermediate revisions by 27 users not shown)
Line 1:
{{Short description|Esoteric programming language}}
{{Use dmy dates|date=April 2021}}
{{For|syntactically significant whitespace in non-esoteric programming languages|Off-side rule}}
[[File:Whitespace in vim2.png|right|206px|thumb|Whitespace [[hello world program]] with syntax highlighting {{legend|#0000ab|tabs}} {{legend|#ab0000|spaces}}]] <!-- make SVG file -->
 
'''Whitespace''' is an [[esoteric programming language|esoteric]] [[programming language]] with [[syntax]] where ''only'' [[whitespace characters]] ([[Space character|space]], [[Tab character|tab]] and [[newline]]) have meaning {{endash}} contrasting typical languages that largely ignore whitespace characters.
'''Whitespace''' is an [[esoteric programming language]] developed by Edwin Brady and Chris Morris at the [[University of Durham]] (also developers of the [[Kaya (programming language)|Kaya]] and [[Idris (programming language)|Idris]] programming languages). It was released on 1 April 2003 ([[April Fool's Day]]). Its name is a reference to [[whitespace character]]s. Unlike most programming languages, which ignore or assign little meaning to most whitespace characters, the Whitespace interpreter ignores any non-whitespace characters. Only [[Space character|spaces]], [[Tab character|tabs]] and [[linefeed]]s have meaning.<ref name="whitespace">{{cite web|url=http://compsoc.dur.ac.uk/whitespace/tutorial.php|title=Whitespace|website=Compsoc|access-date=2015-12-08|url-status=dead|archive-url=https://web.archive.org/web/20150618184706/http://compsoc.dur.ac.uk/whitespace/tutorial.php|archive-date=18 June 2015}}</ref> A consequence of this property is that a Whitespace program can easily be contained within the whitespace characters of a program written in another language, except possibly in languages which depend on spaces for syntax validity such as [[Python (programming language)|Python]], making the text a [[polyglot (computing)|polyglot]].
<ref name="whitespace">{{cite web|url=http://compsoc.dur.ac.uk/whitespace/tutorial.php|title=Whitespace|website=Compsoc|access-date=2015-12-08|url-status=dead|archive-url=https://web.archive.org/web/20150618184706/http://compsoc.dur.ac.uk/whitespace/tutorial.php|archive-date=18 June 2015}}</ref><ref name=parker>{{cite book|title=Humble Pi: a comedy of maths errors|publisher=Allen Lane|date=2019|first=Matt|last=Parker|author-link=Matt Parker|ISBN=978-0-241-36023-1|page=21}}</ref>
 
As a consequence of its syntax, Whitespace [[source code]] can be contained within the whitespace of code written in a language that ignores whitespace {{endash}} making the text a [[polyglot (computing)|polyglot]].<ref name=parker />
The [[programming language|language]] itself is an [[imperative programming|imperative]] [[stack-based language]]. The [[virtual machine]] on which the programs run has a stack and a [[dynamic memory allocation|heap]]. The programmer is free to push arbitrary-width integers onto the stack (currently there is no implementation of floating point numbers) and can also access the heap as a permanent store for variables and [[data structure]]s.
 
Whitespace is an [[imperative programming|imperative]], [[stack-oriented programming|stack-based]] language.
The programmer can push arbitrary-width [[integer]] values onto a [[Stack (abstract data type)|stack]] and access a [[dynamic memory allocation|heap]] to store data.
 
An [[Interpreter (computing)|interpreter]], along with its [[Haskell]] source code, is provided by the Whitespace creators.
 
== History ==
 
Whitespace was created by Edwin Brady and Chris Morris in 2002. [[Slashdot]] gave a review of this [[programming language]] on 1 April 2003.<ref>{{Cite web |url=http://developers.slashdot.org/story/03/04/01/0332202/New-Whitespace-Only-Programming-Language |title=New Whitespace-Only Programming Language |date=2003-04-01 |website=Slashdot |author=Timothy |access-date=2014-01-23}}</ref>
Edwin Brady and Chris Morris, who also developed the Kaya and [[Idris (programming language)|Idris]] languages, created Whitespace in 2002 at the [[University of Durham]].
Whitespace was created by Edwin Brady and Chris Morris in 2002. [[Slashdot]] gavepublished a review of thison [[programmingApril Fool's languageDay]] on 1 April 2003.<ref>{{Cite web |url=http://developers.slashdot.org/story/03/04/01/0332202/New-Whitespace-Only-Programming-Language |title=New Whitespace-Only Programming Language |date=2003-04-01 |website=Slashdot |author=Timothy |access-date=2014-01-23}}</ref>
 
The idea of using whitespace characters as operators for the [[C++]] language had been facetiously suggested five years earlier by [[Bjarne Stroustrup]].<ref>{{cite web |url=http://www.stroustrup.com/whitespace98.pdf |title=Generalizing Overloading for C++2000 |first=Bjarne |last=Stroustrup |publisher=AT&T Labs |___location=Florham Park, NJ, USA |access-date=2014-01-23}}</ref>
 
== Syntax ==
Commands are composed of sequences of spaces, tab stops and linefeeds. For example, tab-space-space-space performs arithmetic addition of the top two elements on the stack.
Data is represented in [[Binary code|binary]] using spaces (0) and tabs (1), followed by a linefeed; thus, tab-space-space-tab-space-tab-tab-linefeed is the binary number 1001011, which is 75 in decimal. All other characters are ignored and thus can be used for comments.
 
CommandsWhitespace aredefines composeda ofcommand sequencesas ofa spaces,sequence tab stopsof andwhitespace linefeedscharacters. For example, tab-space-space-space<code>[Tab][Space][Space][Space]</code> performs arithmetic addition of the top two elements on the stack.
The sign of a number is given by its first character, [Space] for positive and [Tab] for negative.<ref name="whitespace" />
 
A command is written as an instruction modification parameter (IMP) followed by an operation and then any parameters.
<ref name="whitespace" />
 
IMP sequences include:
 
Code is written as an ''Instruction Modification Parameter'' (IMP) followed by the operation.<ref name="whitespace" /> The table below shows a list of all the IMPs in Whitespace.
{| class="wikitable"
|-
Line 34 ⟶ 45:
|}
 
EachOperator IMPsequences, is followedorganized by one operation defined for that IMP, and a parameter if needed. The list of operations supported in Whitespace isinclude:<ref name="whitespace"/>
 
{| class="wikitable"
|-
! IMP !! Command Operator !! Parameter !! Meaning
!Minimum size of the stack required*
|-
| [Space] || [Space] || Number || Push the number onto the stack
|0
|-
| [Space] || [LF][Space] || - || Duplicate the top item on the stack
|1
|-
| [Space] || [Tab][Space] || Number ''n''|| Copy the nth item on the stack (given by the argument) onto the top of the stack**
|''n''+1
|-
| [Space] || [LF][Tab] || - || Swap the top two items on the stack
|2
|-
| [Space] || [LF][LF] || - || Discard the top item on the stack
|1
|-
| [Space] || [Tab][LF] || Number ''n''|| Slide n items off the stack, keeping the top item**
|may be less than '''''n''+1''',
but at least 1 item
(top of the stack)
is required
|-
| [Tab][Space] || [Space][Space] || - || Addition
|2
|-
| [Tab][Space] || [Space][Tab] || - || Subtraction
|2
|-
| [Tab][Space] || [Space][LF] || - || Multiplication
|2
|-
| [Tab][Space] || [Tab][Space] || - || Integer Divisiondivision
|2 (top may not be 0)
|-
| [Tab][Space] || [Tab][Tab] || - ||[[Modulo operation|Modulo]]
|2 (top may not be 0)
|-
| [Tab][Tab] || [Space] || - || Store in heap
|2
|-
| [Tab][Tab] || [Tab] || - || Retrieve from heap
|1
|-
| [LF] || [Space][Space] || Label || Mark a ___location in the program
|0
|-
| [LF] || [Space][Tab] || Label || Call a subroutine
|0
|-
| [LF] || [Space][LF] || Label || Jump to a label
|0
|-
| [LF] || [Tab][Space] || Label || Jump to a label if the top of the stack is zero
|1
|-
| [LF] || [Tab][Tab] || Label || Jump to a label if the top of the stack is negative
|1
|-
| [LF] || [Tab][LF] || - || End a subroutine and transfer control back to the caller
|0 ''(callstack: 1)''
|-
| [LF] || [LF][LF] || - || End the program
|0
|-
| [Tab][LF] || [Space][Space] || - || Output the character at the top of the stack
|1
|-
| [Tab][LF] || [Space][Tab] || - || Output the number at the top of the stack
|1
|-
| [Tab][LF] || [Tab][Space] || - || Read a character and place it in the ___location given by the top of the stack
|1
|-
| [Tab][LF] || [Tab][Tab] || - || Read a number and place it in the ___location given by the top of the stack
|1
|}
 
<nowiki>*</nowiki>Due to Haskell being lazily evaluated, the effect of the stack being too small may only show when, for example, invoking the ''outputting a number'' side-effect.
The "copy" and "slide" operations were added in Whitespace 0.3 and may not be supported by all implementations.<ref name="whitespace"/>
 
<nowiki>**</nowiki>The "''copy"'' and "''slide"'' operations were added in Whitespace 0.3 and may not be supported by all implementations.<ref name="whitespace" />
 
=== Comments ===
 
Characters other than <code>space</code>, <code>tab</code> and <code>linefeed</code> are ignored and thus can be used for comments.
 
=== Numbers ===
 
A numeric value is represented as a sequence of <code>space</code> and <code>tab</code> characters that represent 0 and 1 respectively and terminated by a <code>linefeed</code>. The first character represents the [[Sign (mathematics)|sign]] of the value {{endash}} <code>space</code> for positive and <code>tab</code> for negative. Subsequent characters before the terminator represent the binary digits of a value.
 
For example:
 
* [space][tab][space][space][tab][space][tab][tab][linefeed] (STSSTSTTL) is positive since it starts with <code>space</code> and represents 1001011 in binary, which is 75 in decimal.
* [tab][tab][tab][space][space][tab][space][linefeed] (TTTSSTSL) is negative since it starts with <code>tab</code> and represents -110010 in binary which is −50 in decimal.
 
=== Labels ===
 
A label is used for [[control flow]]. It is a <code>linefeed</code>-terminated sequence of <code>space</code>and <code>tab</code> characters. As there is only one namespace, all labels must be unique.
<ref name="whitespace"/>
 
==Sample code==
 
<!--NOTE: Please be careful when copying/editing the code below. Some user agents may automatically insert linefeed characters for text wrapping, which will cause the code to run incorrectly.-->
The following is a commented Whitespace program that simply prints [[Hello world program|"Hello, world!"]], where each <span style="color:#ffffff;background:#ff9999">Space</span>, <span style="color:#ffffff;background:#9999ff">Tab</span>, or Linefeed character is preceded by the identifying comment "S", "T", or "L", respectively:
S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>L&#10;T<span style="background:#9999ff">&#9;</span>L&#10;S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>T<span style="background:#9999ff">&#9;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>L&#10;T<span style="background:#9999ff">&#9;</span>L&#10;S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>T<span style="background:#9999ff">&#9;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>T<span style="background:#9999ff">&#9;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>L&#10;T<span style="background:#9999ff">&#9;</span>L&#10;S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>T<span style="background:#9999ff">&#9;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>T<span style="background:#9999ff">&#9;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>L&#10;T<span style="background:#9999ff">&#9;</span>L&#10;S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>T<span style="background:#9999ff">&#9;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>T<span style="background:#9999ff">&#9;</span>T<span style="background:#9999ff">&#9;</span>T<span style="background:#9999ff">&#9;</span>L&#10;T<span style="background:#9999ff">&#9;</span>L&#10;S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>T<span style="background:#9999ff">&#9;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>L&#10;T<span style="background:#9999ff">&#9;</span>L&#10;S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>L&#10;T<span style="background:#9999ff">&#9;</span>L&#10;S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>T<span style="background:#9999ff">&#9;</span>T<span style="background:#9999ff">&#9;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>T<span style="background:#9999ff">&#9;</span>T<span style="background:#9999ff">&#9;</span>L&#10;T<span style="background:#9999ff">&#9;</span>L&#10;S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>T<span style="background:#9999ff">&#9;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>T<span style="background:#9999ff">&#9;</span>T<span style="background:#9999ff">&#9;</span>T<span style="background:#9999ff">&#9;</span>L&#10;T<span style="background:#9999ff">&#9;</span>L&#10;S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>T<span style="background:#9999ff">&#9;</span>T<span style="background:#9999ff">&#9;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>S<span style="background:#ff9999">&#32;</span>L&#10;T<span style="background:#9999ff">&#9;</span>L&#10;S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>T<span style="background:#9999ff">&#9;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>T<span style="background:#9999ff">&#9;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>L&#10;T<span style="background:#9999ff">&#9;</span>L&#10;S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>T<span style="background:#9999ff">&#9;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>L&#10;T<span style="background:#9999ff">&#9;</span>L&#10;S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>T<span style="background:#9999ff">&#9;</span>L&#10;T<span style="background:#9999ff">&#9;</span>L&#10;S<span style="background:#ff9999">&#32;</span>S<span style="background:#ff9999">&#32;</span>L&#10;L&#10;L&#10;
 
The following source code is for a Whitespace [[Hello world program|"Hello, world!"]] program. For clarity, it is annotated with <code>S</code>, <code>T</code> and <code>L</code> before each
Note that when Whitespace source code is displayed in some browsers, the horizontal spacing produced by a tab character is not fixed, but depends on its ___location in the text relative to the next [[Tab key#HTML|horizontal tab stop]]. Depending on the software, tab characters may also get replaced by the corresponding variable number of space characters.
<code><span style="color:#ffffff;background:#ff9999">space</span></code>,
 
<code><span style="color:#ffffff;background:#9999ff">tab</span></code>, and <code>linefeed</code>.
==See also==
{{not a typo start}}
* [[Polyglot (computing)|Polyglot]], a program valid in more than one language
S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>L:Push_+1001000=72='H'_onto_the_stack&#10;T<span style="background:#9999ff">&#9Tab;</span>L&#10;S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S:Output_'H';_S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>T<span style="background:#9999ff">&#9Tab;</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>L:Push_+1100101=101='e'_onto_the_stack&#10;T<span style="background:#9999ff">&#9Tab;</span>L&#10;S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S:Output_'e';_S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>T<span style="background:#9999ff">&#9Tab;</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>T<span style="background:#9999ff">&#9Tab;</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>L:+1101100=108='l'&#10;T<span style="background:#9999ff">&#9Tab;</span>L&#10;S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>T<span style="background:#9999ff">&#9Tab;</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>T<span style="background:#9999ff">&#9Tab;</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>L:+1101100=108='l'&#10;T<span style="background:#9999ff">&#9Tab;</span>L&#10;S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>T<span style="background:#9999ff">&#9Tab;</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>T<span style="background:#9999ff">&#9Tab;</span>T<span style="background:#9999ff">&#9Tab;</span>T<span style="background:#9999ff">&#9Tab;</span>L:+1101111=111='o'&#10;T<span style="background:#9999ff">&#9Tab;</span>L&#10;S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>T<span style="background:#9999ff">&#9Tab;</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>L:+101100=44=','&#10;T<span style="background:#9999ff">&#9Tab;</span>L&#10;S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>L:+100000=32=Space&#10;T<span style="background:#9999ff">&#9Tab;</span>L&#10;S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>T<span style="background:#9999ff">&#9Tab;</span>T<span style="background:#9999ff">&#9Tab;</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>T<span style="background:#9999ff">&#9Tab;</span>T<span style="background:#9999ff">&#9Tab;</span>L:+1110111=119='w'&#10;T<span style="background:#9999ff">&#9Tab;</span>L&#10;S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>T<span style="background:#9999ff">&#9Tab;</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>T<span style="background:#9999ff">&#9Tab;</span>T<span style="background:#9999ff">&#9Tab;</span>T<span style="background:#9999ff">&#9Tab;</span>L:+1101111=111='o'&#10;T<span style="background:#9999ff">&#9Tab;</span>L&#10;S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>T<span style="background:#9999ff">&#9Tab;</span>T<span style="background:#9999ff">&#9Tab;</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>S<span style="background:#ff9999">&#32;{{sp}}</span>L:+1110010=114='r'&#10;T<span style="background:#9999ff">&#9Tab;</span>L&#10;S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>T<span style="background:#9999ff">&#9Tab;</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>T<span style="background:#9999ff">&#9Tab;</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>L:+1101100=108='l'&#10;T<span style="background:#9999ff">&#9Tab;</span>L&#10;S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>T<span style="background:#9999ff">&#9Tab;</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>L=+1100100=100='d'&#10;T<span style="background:#9999ff">&#9Tab;</span>L&#10;S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>T<span style="background:#9999ff">&#9Tab;</span>L:+100001=33='!'&#10;T<span style="background:#9999ff">&#9Tab;</span>L&#10;S<span style="background:#ff9999">&#32;{{sp}}</span>S<span style="background:#ff9999">&#32;{{sp}}</span>L:Output_'!';_L&#10;L&#10;L:End_the_program&#10;
* [[Steganography]], the technique of concealing a message within another message
{{not a typo end}}
* [[Off-side rule#Off-side rule languages|Off-side rule languages]], where blocks are expressed by whitespace indentation
Note that whenWhen Whitespace source code is displayed in some browsers, the horizontal spacing produced by a tab character is not fixed, but depends on its ___location in the text relative to the next [[Tab key#HTML|horizontal tab stop]]. Depending on the software, tab characters may also get replaced by the corresponding variable number of space characters.
** [[Python syntax and semantics#Indentation|Python]], the best-known example of a language with syntactically significant whitespace
* [[Esoteric programming language]]s
** [[Brainfuck]], which consists of only eight simple commands and an instruction pointer
** [[INTERCAL]], the "Compiler Language With No Pronounceable Acronym"
** [[LOLCODE]], which is patterned after a [[Lolcats|series]] of [[Internet meme]]s
** [[Malbolge]], which is specifically designed to be nearly impossible to program in
 
==References==
 
<references/>
 
==External links==
 
*{{Official website|https://web.archive.org/web/20150618184706/http://compsoc.dur.ac.uk/whitespace/tutorial.php}}
*[http://developers.slashdot.org/article.pl?sid=03/04/01/0332202 Release announcement on Slashdot]
Line 124 ⟶ 179:
[[Category:Programming languages created in 2002]]
[[Category:Stack-oriented programming languages]]
* [[{{Esoteric programming language]]slanguages}}