https://github.com/rsharp-lang/R-sharp

今天在这里给大家介绍的是一些在R#脚本语言编程之中的一些高级语法,关于R#语言的一些基础语法,大家可以阅读R#语言教程系列的第一篇《R#语言简明教程

对于R#脚本与R脚本语言之间的关系,大家可以将R#语言看作为R语言的一个超集,相似于TypeScript语言与JavaScript语言之间的关系。在这篇文章中,我主要向大家介绍在R#语言之中针对R语言的一些不足进行的改进部分。

错误捕捉与错误处理

对于任意一种编程语言,都会存在对于错误的捕捉处理。例如在VisualBasic语言之中的Try Catch语句块:

Try
    ' code that may throw unexpected exception
Catch ex As Exception
    ' handle exception
End Try

在传统的R语言之中,也存在着相对应的tryCatch函数(在R语言之中,并没有对应的语法进行错误的捕捉与处理)来处理错误。例如:

tryCatch({
    # code that may throw unexpected exception
}, error = function(ex) {
    # handle exception
});

在R#语言之中,针对错误的捕捉处理这一块进行了提升。大家可以通过类似于VisualBasic类似的Try Catch语法进行错误的捕捉与处理:

# just catch exception
x = try({
    # code that may throw unexpected exception
    # this block of code that may be returns a
    # try-error object
});

# handle exception
x = try(ex => {
   # code that may throw unexpected exception
}) {
   # handle exception ex
}

可以看到,在R#脚本语言之中,对错误的捕捉与处理都统一到了一个try语句块之中。如果希望在捕捉到了error信息之后,还进行后续的处理,可以在try语句块的后面添加一个closure表达式进行错误的处理。

实际上,添加了错误处理的closure表达式是与下面的表达式代码是等价的:

x = try({
    # code that may throw unexpected exception
});

x = if (typeof(x) == "try-error") {
    # handle unexpected exception
} else {
    x;
}

在R#脚本语言之中的这个语法改进,是不是相对于原来的R语言在语言的简洁程度上提升了很多?

Switch语句

在R#脚本语言之中,也存在着与传统的R脚本类似的Switch语句块。只不过在传统的R脚本语言之中的Switch语句块,并没有专门的针对于未匹配的选项的处理代码。而在R#语言之中则专门针对这个方面进行了加强:

const eval as function(type, x) {
    switch(type, default -> stop(`invalid option: ${type}`)) {
        # the identifier name at here is the
        # string literal value, actually
        mean           = mean(x),
        max            = max(x),
        "user-defined" = user(x)
    }
}

# passed
eval("user-defined", [1,2,3,4,5]);

# this expression will throw exception
# as the option 'xxxxx' is not matched 
# in the switch closure
eval("xxxxx", [1,2,3,4,5]);

序列生成语法

在R#脚本语言之中,保存着一个与R脚本语言之中较为一致的序列生成语法,例如下面的代码都可以在R或者R#的解释器环境之中被正常的执行:

1:100

上面的序列生成语法产生的数据间隔默认是1,但是假若我们需要产生数据间隔为0.5的数据呢。在R脚本之中由于没有对应的语法进行数值间隔的设置,所以必须要使用seq函数来生成。但是在R#脚本之中,则专门针对这一个功能进行了语法改进,现在你可以使用step关键词进行数值间隔的设置。下面的R#序列生成语法与seq函数的功能是一致的:

x = 1:100 step 0.5;
y = seq(1, 100, 0.5);

all(x == y);
# [1] TRUE

专门的正则表达式字符串处理语法

在R脚本语言之中,使用正则表达式会非常的麻烦,而在R#脚本语法之中,则专门针对使用正则表达式进行字符串的处理进行了语法设计:

如果我们想要进行正则表达式匹配的话,在R#脚本之中可以直接将正则表达式当作为一个函数进行使用,例如使用下面的语法进行字符串的正则表达式匹配:

$"[a-z]+\d+"(["x1+x2", "bbb"]);
# [1] "x1" ""

需要注意的是,使用上面的语法进行字符串正则表达式模式匹配,仅仅会返回第一个匹配上的子字符串结果。如果需要匹配上所有的结果,则需要使用matches函数来完成:

$"[a-z]+\d+"
|> matches(["x1+x2", "bbb"]);
# [[1]]
# [1] "x1" "x2"
# [[2]]
# NULL

例如我们想要查看目标字符串是否是完全属于目标正则表达式的匹配规则,则可以直接使用等价操作符进行判断,例如下面的两个表达式产生的结果是等价的:

["abc", "x1"] == $"[a-z]+\d+";
# [1] FALSE TRUE

x = $"[a-z]+\d+"(["abc", "x1"]);
# [1] "" "x1"
x == ["abc", "x1"];
# [1] FALSE TRUE

上面的语法是进行正则表达式模式匹配判断,实际上在R#脚本语言之中还存在着一个与上面的正则表达式匹配判断类似的通配符匹配的语法。这个通配符匹配的语法是使用的like操作符来完成的:

["abc", "axxxx", "x1"] like "a*";
# [1] TRUE TRUE FALSE
Latest posts by xie guigang (see all)

4 Responses

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注