2014-01-29 19:14:56 +04:00
---
name: Red
category: language
language: Red
filename: learnred.red
contributors:
- ["Arnold van Hofwegen", "https://github.com/iArnold"]
---
Red was created out of the need to get work done, and the tool the author wanted to use, the language of REBOL, had a couple of drawbacks.
It was not Open Sourced at that time and it is an interpreted language, what means that it is on average slow compared to a compiled language.
Red, together with its C-level dialect Red/System, provides a language that covers the entire programming space you ever need to program something in.
Red is a language heavily based on the language of REBOL. Where Red itself reproduces the flexibility of the REBOL language, the underlying language Red will be built upon,
Red/System, covers the more basic needs of programming like C can, being closer to the metal.
Red will be the worlds first Full Stack Programming Language. This means that it will be an effective tool to do (almost) any programming task on every level
from the metal to the meta without the aid of other stack tools.
Furthermore Red will be able to cross-compile Red source code without using any GCC like toolchain
from any platform to any other platform. And it will do this all from a binary executable that is supposed to stay under 1 MB.
Ready to learn your first Red?
2014-01-29 20:23:11 +04:00
```Red
2014-01-30 12:57:20 +04:00
All text before the Red header will be treated as comment.
2014-01-30 12:32:58 +04:00
The Red header is the word "Red" followed by a whitespace character followed by a block of square brackets [].
2014-01-30 12:57:20 +04:00
The block of brackets can be filled in with useful information about the script or program, the author,
the filename, the version, the license, what the program does or needs.
2014-01-30 12:32:58 +04:00
The Red/System header is just like the Red header, only saying "Red/System" and not "Red".
Red []
2014-01-29 20:23:11 +04:00
;this is a commented line
2014-01-29 19:14:56 +04:00
2014-01-30 12:32:58 +04:00
print "Hello Red World" ; this is another comment
2014-01-29 19:14:56 +04:00
comment {
2014-01-30 12:57:20 +04:00
This is a multiline comment.
2014-01-30 12:32:58 +04:00
You just saw the Red version of the "Hello World" program.
2014-01-29 19:14:56 +04:00
}
; Your program's entry point is the first executable code that is found
; no need to restrict this to a 'main' function.
; Valid variable names start with a letter and can contain numbers,
; variables containing only capital A thru F and numbers and ending with 'h' are
; forbidden, because that is how hexadecimal numbers are expressed in Red and
; Red/System.
2014-01-30 00:27:53 +04:00
; assign a value to a variable using a colon ":"
2014-01-29 19:14:56 +04:00
my-name: "Red"
2014-01-30 00:30:53 +04:00
reason-for-using-the-colon: {Assigning values using the colon makes
the equality sign "=" exclusively usable for comparisons purposes,
exactly what "=" was intended for in the first place!
Remember this y = x + 1 and x = 1 => y = 2 stuff from school?
2014-01-30 00:27:53 +04:00
}
2014-01-29 19:14:56 +04:00
is-this-name-valid?: true
2014-01-30 00:30:53 +04:00
; print output using print, or prin for printing without a newline or linefeed at the
; end of the printed text.
2014-01-29 19:14:56 +04:00
prin " My name is " print my-name
My name is Red
print ["My name is " my-name lf]
My name is Red
; In case you haven't already noticed: statements do NOT end with a semicolon ;-)
;
; Datatypes
;
; If you know Rebol, you probably have noticed it has lots of datatypes. Red
; does not have yet all those types, but as Red want to be close to Rebol it
; will have a lot of datatypes.
; You can recognize types by the exclamation sign at the end. But beware
; names ending with an exclamation sign are allowed.
; Some of the available types are integer! string! block!
; Declaring variables before using them?
; Red knows by itself what variable is best to use for the data you want to use it
; for.
; A variable declaration is not always necessary.
; It is considered good coding practise to declare your variables,
; but it is not forced upon you by Red.
; You can declare a variable and specify its type. a variable's type determines its
; size in bytes.
; Variables of integer! type are usually 4 bytes or 32 bits
my-integer: 0
; Red's integers are signed. No support for unsigned atm but that will come.
; To find out the type of variable use type?
type? my-integer
integer!
i2: 1 + i1: 1
; Arithmetic is straightforward
i1 + i2 ; result 3
i2 - i1 ; result 1
i2 * i1 ; result 2
i1 / i2 ; result 0 (0.5, but truncated towards 0)
; Comparison operators are probably familiar, and unlike in other languages you
; only need a single '=' sign for comparison.
; There is a boolean like type in Red. It has values true and false, but also the
; values on/off or yes/no can be used
2014-01-30 00:35:28 +04:00
3 = 2 ; result false
3 != 2 ; result true
3 > 2 ; result true
3 < 2 ; result false
2 < = 2 ; result true
2 >= 2 ; result true
2014-01-29 19:14:56 +04:00
;
; Control Structures
2014-01-29 20:23:11 +04:00
;
; if
; Execute a block of code if a given condition is true. IF does not return any value,
; so cannot be used in an expression.
if a < 0 [ print " a is negative " ]
; either
; Execute a block of code if a given condition is true, else execute an alternative block of code.
; If last expressions in both blocks have the same type, EITHER can be used inside an expression.
either a < 0 [
either a = 0 [
msg: "zero"
][
msg: "negative"
]
][
msg: "positive"
]
print ["a is " msg lf]
; An alternative way to write it (allowed because all code paths return a value of the same type):
msg: either a < 0 [
either a = 0 [
"zero"
][
"negative"
]
][
"positive"
]
print ["a is " msg lf]
; until
; Loop over a block of code until the condition at end of block, is met. UNTIL does not return any value,
; so cannot be used in an expression.
c: 5
until [
prin "o"
c: c - 1
2014-01-30 00:35:28 +04:00
c = 0 ; the condition to end the until loop
2014-01-29 20:23:11 +04:00
]
; will output:
ooooo
; Note that the loop will always be executed at least once, even if the condition is not met from the beginning.
; while
; While a given condition is met, execute a block of code. WHILE does not return any value,
; so cannot be used in an expression.
c: 5
while [c > 0][
prin "o"
c: c - 1
]
; will output:
ooooo
2014-01-29 19:14:56 +04:00
;
; Functions
;
2014-01-30 00:35:28 +04:00
; function example
2014-01-29 19:14:56 +04:00
twice: function [a [integer!] /one return: [integer!]][
c: 2
a: a * c
either one [a + 1][a]
]
2014-01-30 13:33:19 +04:00
b: 3
print twice b ; will output 6.
2014-01-29 19:14:56 +04:00
2014-01-29 20:23:11 +04:00
; Import external files with #include and filenames start with a % sign
#include %includefile.red
2014-01-30 13:33:19 +04:00
; Now the functions in the included file can be used too.
2014-01-29 19:14:56 +04:00
```
## Further Reading
2014-01-30 13:33:19 +04:00
The main source for information about Red is the [Red language homepage ](http://www.red-lang.org ).
2014-01-29 19:14:56 +04:00
2014-01-29 20:23:11 +04:00
The Red/System language specification can be found [here ](http://static.red-lang.org/red-system-specs-light.html ).
2014-01-29 19:14:56 +04:00
To learn more about Rebol and Red join the [chat on StackOverflow ](http://chat.stackoverflow.com/rooms/291/rebol-and-red ).
(You will need 20 points to chat but if you ask questions about Red or Rebol we will help you get those points).
Maybe you want to try Red right away? That is possible on the [try Rebol and Red site ](http://tryrebol.esperconsultancy.nl ).
2014-01-29 20:23:11 +04:00
You can also learn Red by learning some [Rebol ](http://www.rebol.com/docs.html ).