Red语言学习系列(1)

# Red/System语法

这里给出Red/System的简要介绍,详细文档参考这里 (opens new window)

# 注释

a: 1    ;This is a comment

# Blocks块

block在Rebol系中是一个很重要的语法现象,类似于lisp中的括号。来看一个 例子:

if a > 0 [print "TRUE"]

依照我们的经验我们能知晓这条语句的功能,我们仔细分析一下:

if关键词告诉我们它后面跟着的是一个判断语句和一个block,显然a > 0是判断语句,[print "TRUE"]if语法需要的block,而且block中的内容在条件符合时得到执行。

是不是挺简单?

# 赋值语句

a: 1234
b: "bitbegin"
c: #"A"

很简单,不解释。

注意:后面有一个空格。

# 函数

foo: func [
    a [integer!]
    return: [integer!]
][
    b: 10
    a + b
]
print foo 5

那么Red是怎么执行的呢?这个过程解释的有的麻烦,但是也是有规律的:语句一定是从左到右执行的。print需要一个参数,取foo是一个函数,foo需要一个整形的参数,取5是个整数,这时foo得到执行返回15, 15作为参数传递给printprint输出15

# 类型

在上面的例子中我们见到了integer!,它代表整型类型。Red/System支持的类型还有:

  • integer!
  • byte!
  • float!
  • float32!
  • logic!
  • c-string!
  • struct!
  • pointer!

# refinement

refinement是一个很有意思的语法,在C语系中对于结构体中的变量使用.来访问,而在Rebol系中使用/访问。

s: declare struct! [
   a   [integer!]
   b   [c-string!]
   c   [struct! [d [integer!]]]
]
s/a: 123
s/b: "bitbegin"

相比C语系的.refinement有更多的作用。比如可以细化函数的功能,可以索引数组。

list: [123 456 789]
probe list/0                           ;-- outputs 3
probe list/2                           ;-- outputs 456

# 获取变量指针

Reb/System有4中类型的变量可以使用:获取变量的指针。

  • integer!
  • byte!
  • float!
  • float32!

Example:

s: declare pointer! [integer!]
a: 123
s: :a
print s/value       ;-- will output 123

Ok, 基本的语法我们已经有了个印象,下面我们实际应用一下。