源代碼下載: LearnRed-zh.red
Red 的編寫是出於工作需要,該語言的作者想要使用 REBOL,但它有許多缺陷。
當時 REBOL 還沒有開源,由於它是一門解釋型語言,這就意味着它比編譯型語言效率低。
Red 使用 C 語言級別的 Red/System,是一門涉及所有編程領域的語言。
Red 基於 REBOL 編寫,它繼承了 REBOL 的靈活性,同時也包含了許多 C 語言能做的底層實現。
Red 將會成為世界上第一門全棧式編程語言,這意味着它可以完成幾乎所有的編程任務,從底層到抽象,無需其他工具的參與。
而且,Red 支持交叉編譯,任意兩個平台之間,不需要任何 GCC 之類的工具鏈的支持。
所有的工作,僅僅需要一個不到 1 MB 的二進制可執行文件。
準備好你的 Red 第一課了嗎?
所有 header 之前的文字都是註釋,只要你不使用 "red" 關鍵字,其中的 "r" 大寫。
這是詞法分析器的一個缺陷,所以大多數時候,你都應該直接以 header 開始程序或者腳本的編寫。
red 腳本的 header 由關鍵字,首字母大寫的 "red" 開始,後跟一個空格,再跟一對方括號 []。
方括號裏可以寫上一些關於這段腳本或者程序的相關信息:
作者,文件名,版本號,license,程序功能的簡介,它依賴的其他文件。
red/System 的 header 和 red header 類似,僅僅是説明 "red/System" 而非 "red"。
Red []
; 這是一條行註釋
print "Hello Red World" ; 另一條註釋
comment {
這是多行註釋。
你剛剛看到的就是 Red 版的 Hello World。
}
; 程序的入口就是第一句可執行的代碼
; 不需要把它放在 'main' 函數裏
; 變量名以一個字母開始,可以包含數字,
; 只包含 A ~ F 字符和數字的變量名不能以 'h' 結尾,
; 因為這是 Red 和 Red/System 中十六進制數字的表達方式。
; 給變量賦值使用冒號 ":"
my-name: "Red"
reason-for-using-the-colon: {使用冒號作為賦值符號
是為了能夠讓 "=" 能夠用來作為比較符號,這本來就是 "="
存在的意義!還記得上學時學的,y = x + 1 、 x = 1,
以及推導出的 y = 2 嗎?
}
is-this-name-valid?: true
; 用 print 打印輸出,prin 打印不帶換行的輸出
prin "我的名字是 " print my-name
; 我的名字是 Red
print ["我的名字是 " my-name lf]
; 我的名字是 Red
; 注意到了嗎:語句沒有以分號結尾 ;-)
;
; 數據類型
;
; 如果你瞭解 Rebol,你可能就會注意到它有許多數據類型。
; Red 並沒有囊括它所有的類型,但由於 Red 想要儘可能的
; 接近 Rebol,所以它也會有很多數據類型。
; 類型以歎號結尾,但要注意,變量名也是可以以歎號結尾的。
; 一些內置類型有 integer! string! block!
; 使用變量前需要聲明嗎?
; Red 能夠分辨什麼時候使用什麼變量,變量聲明並非必要的。
; 一般認為,聲明變量是較好的編碼實踐,但 Red 並不會強制這點。
; 你可以聲明一個變量然後指定它的類型,而一個變量的類型就
; 指定了它的字節大小。
; integer! 類型的變量通常是 4 字節,32位
my-integer: 0
; Red 的整型包含符號,暫時不支持無符號類型,但以後會支持的。
; 怎樣判斷一個變量的類型?
type? my-integer
; integer!
; 一個變量的初始化可以使用另一個同樣剛剛初始化的變量:
i2: 1 + i1: 1
; 算數運算符
i1 + i2 ; 3
i2 - i1 ; 1
i2 * i1 ; 2
i1 / i2 ; 0 (0.5,但截取為 0)
; 比較運算符都差不多,但和其他語言不一樣的是相等的比較,
; Red 使用單個的 '='。
; Red 有一個類似 boolean 的類型,它的值是 true 和 false,
; 但也可以使用 on/off 或者 yes/on
3 = 2 ; false
3 != 2 ; true
3 > 2 ; true
3 < 2 ; false
2 <= 2 ; true
2 >= 2 ; true
;
; 控制流
;
; if
; 如果給定的條件為 true 則執行一段代碼塊。
; if 沒有返回值,所以不能用作表達式。
if a < 0 [print "a 是負值"]
; either
; 如果給定的條件為 true 則執行一段代碼塊,否則就
; 執行另一段可選的代碼塊。如果兩個代碼塊中最後一個表達式
; 的類型相同, either 就可以用作表達式。
either a > 0 [
msg: "正值"
][
either a = 0 [
msg: "零"
][
msg: "負值"
]
]
print ["a 是 " msg lf]
; 還可以有另一種寫法
; (因為兩條路徑的返回值相同,所以可以這麼寫):
msg: either a > 0 [
"正值"
][
either a = 0 [
"零"
][
"負值"
]
]
print ["a 是 " msg lf]
; until
; 循環執行一段代碼塊,直到滿足給定的條件為止。
; UNTIL 在最後一次循環執行完最後一個表達式後,總是返回真值 'true'。
c: 5
until [
prin "o"
c: c - 1
c = 0 ; 終止循環的條件
]
; 輸出:ooooo
; 需要注意的是,即使條件從一開始就不滿足,
; 這個循環也至少會執行一次。
; while
; 當滿足給定的條件,就執行一段代碼。
; while 沒有返回值,不能用在表達式中。
c: 5
while [c > 0][
prin "o"
c: c - 1
]
; 輸出:ooooo
;
; 函數
;
; 函數示例
twice: function [a [integer!] /one return: [integer!]][
c: 2
a: a * c
either one [a + 1][a]
]
b: 3
print twice b ; 輸出 6
; 使用 #include 和 %文件名 來導入外部文件
#include %includefile.red
; 現在就可以使用 includefile.red 中的函數了。
更進一步
Red 相關的源碼信息在 Red 語言主頁。
源代碼的 github 庫。
Red/System 特性在 這裏。
想要了解更多關於 Rebol 和 Red 的信息,加入 Gitter 聊天室。如果你無法加入,也可以給我們發郵件。
也可以在 Stack Overflow 上查閲、提交問題。
也許你現在就要試一試 Red ?可以在線嘗試 try Rebol and Red site。
你也可以通過學習一些 Rebol 來學習 Red。
有建議?或者發現什麼錯誤?在Github上開一個issue,或者發起pull request!
原文由Arnold van Hofwegen撰寫,並由0個好心人修改。
Translated by: Limo Saplf
© 2022 Arnold van Hofwegen
本作品採用 CC BY-SA 3.0 協議進行許可。