art

red 语言初体验

2017-10-05  本文已影响803人  ColdRomantic

我第一次听到 red 这门语言是在2017-07-20,是通过陈天的一篇关于 red 的文章。正好趁十一,闲得浮生几日,来入个门。下面步入正题:
red 目前最新的版本是0.6.3 (2017-10-05)

1 red 语言特性

我们首先来看下 red 语言的一些特性:

2 尝试做个计算器

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

右边是要实现计算器的效果

代码实现:

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...

上一篇下一篇

猜你喜欢

热点阅读