我第一次听到 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 刚刚好。 red-native-gui

  • 3 red 类型树 red 目前提供了大约50多种常用类型,而且能够赋值时自动识别类型。 red-language-types-tree

  • 4 程序小 red 可执行程序只有1.1M左右,cool!

2 尝试做个计算器

光说不练假把式,我们来仿写一个 Apple 计算器。

red-calculator-rendering 代码实现:

  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-packaging-distribution

如果你也感兴趣,可以好好把玩。red 1.0,期待ing…