我第一次听到 red 这门语言是在2017-07-20,是通过陈天的一篇关于 red 的文章。正好趁十一,闲得浮生几日,来入个门。下面步入正题:
red 目前最新的版本是0.6.3 (2017-10-05)
1 red 语言特性
我们首先来看下 red 语言的一些特性:
-
1 red 是一门编译型语言,不走虚拟机,直接编译成目标平台的,和 C 代码同级别性能的二进制。编译时可以直接跨平台往 windows / linux / osx 等 target OS,以及 x86 / arm 等 target CPU 上面编译。
-
2 跨平台的本地GUI
看上去像是一门后端的语言,竟然去抢前端的饭碗。而且,妄图支持 osx,windows,android,iOS,一统江湖。是的,就是这么性感。
突然觉得,如果只想学一门语言,又想成为全栈工程师,red 刚刚好。
-
3 red 类型树
red 目前提供了大约50多种常用类型,而且能够赋值时自动识别类型。
-
4 程序小
red 可执行程序只有1.1M左右,cool!
2 尝试做个计算器
光说不练假把式,我们来仿写一个 Apple 计算器。
代码实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
Red [
Title: "计算器"
Author: "ForrestSu"
Date: 2017-10-04
Version: 1.0.0
purpose: "模仿Apple计算器"
File: %applecalc.red
Needs: 'View
]
lite-gray: 220.220.220
white-gray: 240.240.240
; 下面的值保存当前内存中的值
value1: 0 ;上一次计算的结果
value2: 0 ;正在输入的数
last_op: "=" ;上一次按下的键
is_point?: false ;标记是否已经输入过小数点
view [
title "计算器" ;视窗标题
; 从按键的外观和功能来分析,我把按键分为三类,分别是:
; * 数字键:十个数字和小数点
; * 计算键:加、减、乘、除、以及等号
; * 功能键:「C/AC」、「+/-」、「%」
; 为此三类我们定义了三个样式,分别是 num_btn,func_btn,op_btn 。num_btn,func_btn,op_btn 。
style btn: base white-gray 60x50 font-size 16 draw [pen gray box 0x0 60x50]
style num_btn: btn white-gray[
; 「C/AC」按键上面的文字会在 "AC" 和 "C" 之间切换:
; * AC 用来清除「当前状态」。
; * C 用来清除当前画面,使得画面显示0。
; 当数字键被按下之后,画面上有数字了,「C/AC」键就会显示「C」
c_btn/text: "C"
; 小数点是否已经被按过
either not is_point? [
display/data: value2: value2 * 10 + load face/text
][
append display/text face/text
;value2此时必须跟著画面一起更新
value2: display/data
]
]
; func_btn 是功能键,继承自 btn,改变了颜色,但不定义共同的行为,
; 因为每个功能键的行为差异太大。
style func_btn: btn lite-gray
style op_btn: btn orange font-color white [
value2: display/data
value1: switch last_op [
"÷" [ value1 * 1.0 / value2 ]
"x" [ value1 * value2]
"-" [ value1 - value2]
"+" [ value1 + value2]
"=" [ value2]
]
if none? value1 [ value1: 0 ]
; 计算完了是否把 value2 清空
value2: 0
is_point?: false
last_op: face/text ;记录此次按下的符号
display/data: value1
]
origin 0x0
space 0x0
display: text gray 240x50 font-color white font-size 30 right data 0
return
c_btn: func_btn "AC" [
either "AC" = face/text [
; 当上面的字样是”AC"时,表示要清除内存,把 is-point?、value1、op、value2
; 这四个值都恢复到原状。但因为出现 "AC" 表示已经出现过 "C",而处理"C" 的时候
; 会把 value2 和 is-point? 复原,所以这里只要复原 value1 和 op 即可。
value1: 0
last_op: "="
][
display/data: 0
value2: 0
is_point?: false
; 按下"C"之后,上面的字样会变成"AC"
face/text: "AC"
]
]
func_btn "+/-" [
; 如果第一个字符是减号,就去除减号
either #"-" = display/text/1 [
remove display/text
][ insert display/text #"-" ]
]
func_btn "%" [
display/data: display/data / 100.0
]
op_btn "÷" return
num_btn "7" num_btn "8" num_btn "9" op_btn "x" return
num_btn "4" num_btn "5" num_btn "6" op_btn "-" return
num_btn "1" num_btn "2" num_btn "3" op_btn "+" return
num_btn "0" 120x50 draw [ pen gray box 0x0 120x50 ]
num_btn "." [
if not is_point? [
append display/text "."
is_point?: true
]
]
op_btn "="
]
|
代码去除注释大概80行左右,具体代码在这里就不详细解释了!
Amazing, so sexy!
最后编译成可执行程序:
red -t Windows -o red\applecalc.exe red\applecalc.red
最后生成exe可执行文件。(外加一个运行时库 libRedRt.dll)
如果你也感兴趣,可以好好把玩。red 1.0,期待ing…