Content deleted Content added
Barçaforlife (talk | contribs) No edit summary Tags: Mobile edit Mobile web edit Advanced mobile edit |
|||
(23 intermediate revisions by 20 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 [[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]] published a review of the [[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]].
▲
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 ==
Whitespace defines a command as a sequence of whitespace characters. For example, <code>[Tab][Space][Space][Space]</code> performs arithmetic addition of the top two elements on the stack.
A command is written as an instruction modification parameter (IMP) followed by an operation and then any parameters.
<ref name="whitespace" />
IMP sequences include:
{| class="wikitable"
|-
Line 34 ⟶ 45:
|}
{| class="wikitable"
|-
! IMP !!
!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''+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
|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
|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
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.
▲==== Examples ====
For example:
* [space
* [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.-->
S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>L:Push_+1001000=72='H'_onto_the_stack T<span style="background:#9999ff">	</span>L S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>:Output_'H';_S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>T<span style="background:#9999ff">	</span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>L:Push_+1100101=101='e'_onto_the_stack T<span style="background:#9999ff">	</span>L S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>:Output_'e';_S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>T<span style="background:#9999ff">	</span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>T<span style="background:#9999ff">	</span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>L:+1101100=108='l' T<span style="background:#9999ff">	</span>L S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>T<span style="background:#9999ff">	</span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>T<span style="background:#9999ff">	</span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>L:+1101100=108='l' T<span style="background:#9999ff">	</span>L S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>T<span style="background:#9999ff">	</span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>T<span style="background:#9999ff">	</span>T<span style="background:#9999ff">	</span>T<span style="background:#9999ff">	</span>L:+1101111=111='o' T<span style="background:#9999ff">	</span>L S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>T<span style="background:#9999ff">	</span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>L:+101100=44=',' T<span style="background:#9999ff">	</span>L S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>L:+100000=32=Space T<span style="background:#9999ff">	</span>L S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>T<span style="background:#9999ff">	</span>T<span style="background:#9999ff">	</span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>T<span style="background:#9999ff">	</span>T<span style="background:#9999ff">	</span>L:+1110111=119='w' T<span style="background:#9999ff">	</span>L S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>T<span style="background:#9999ff">	</span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>T<span style="background:#9999ff">	</span>T<span style="background:#9999ff">	</span>T<span style="background:#9999ff">	</span>L:+1101111=111='o' T<span style="background:#9999ff">	</span>L S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>T<span style="background:#9999ff">	</span>T<span style="background:#9999ff">	</span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>S<span style="background:#ff9999"> </span>L:+1110010=114='r' T<span style="background:#9999ff">	</span>L S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>T<span style="background:#9999ff">	</span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>T<span style="background:#9999ff">	</span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>L:+1101100=108='l' T<span style="background:#9999ff">	</span>L S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>T<span style="background:#9999ff">	</span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>L=+1100100=100='d' T<span style="background:#9999ff">	</span>L S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>T<span style="background:#9999ff">	</span>L:+100001=33='!' T<span style="background:#9999ff">	</span>L S<span style="background:#ff9999"> </span>S<span style="background:#ff9999"> </span>:Output_'!';_L L L:End_the_program ▼
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>.
{{not a typo start}}
▲ S<span style="background:#ff9999">
{{not a typo end}}
▲
* [[Esoteric programming language]]s▼
==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 137 ⟶ 179:
[[Category:Programming languages created in 2002]]
[[Category:Stack-oriented programming languages]]
|