整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

(三语)一段代码让你Red语言快速入门-R1.3

(三语)一段代码让你Red语言快速入门-R1.3

本系列是“2+1”三语学编程系列,三语是英文、中文加计算机语言;即用英语来学习编程语言,并以中文为辅助;

* 用英语来理解和学习计算机语言是最好的方式,这一系列的文章力求帮助大家在计算机语言上和英语阅读能力上都有所提升;

* 推荐的阅读的方法是:先原文,适当看解析阅读,实在不行再看双语对照。* 解析中英语单词的音标使用Dictcom和IPA双音标标注,如果需要了解Dictcom音标,请参看我们的《dictionary.com所用的音标体系》一文。



Red语言是一门轻巧、便捷而又高效的编程语言,它非常吸引人的特性包括:


  1. 主程序只有一个文件,无需安装,但居然也能提供交互式环境编程,能够解释运行,也能够编译运行,并且还能够跨平台编译(甚至可以直接跨平台编译到Android系统);
  2. 提供语言级上的、方便的原生图形化界面(GUI)编程能力,几句话就能搭建一个功能完整的图形界面,这是大多数其他主流语言都没有做到的;
  3. 自嵌入脚本能力,Red编写的程序,自己就可以解释执行其他的Red代码,这对于编译型的语言来说一般是不具备的能力;
  4. 自带的Parse子语言是正则表达式的一种替代方案,相对更加接近人类思维,能够实现的功能理论上也比正则表达式直接能做到的更多。


下面,我们就用一段代码来体会一下Red语言的基本编程,这段代码实现的功能很简单,就是统计一个文本文件中的文本行数。本文的主要目的,就是帮助具有一定其他语言编程基础的读者快速了解Red语言的特性并能够上手Red语言的基本编程。


在这之前,我们照例先从原文看看Red语言基本语法的一些说明:


Red is case insensitive, but there are few exceptions, the most relevant is that a program must begin with Red (not REd or red).

—— insensitive 形容词 [in-'sen-si-tiv][?n'sens?t?v] adj. 不敏感的
—— exceptions 原型:exception 名词复数形式 [ik-'sep-shuh?n][?k'sep?n] n. 例外
—— relevant 形容词 ['rel-uh-vuhnt]['rel?v?nt] adj. 相关的;切题的;有重大关系的;有意义的
—— program 名词 ['proh-gram, -gruh?m]['pr??ɡr?m] n. 程序

【解说】“case insensitive”是大小写不敏感的意思,所谓的大小写不敏感,是指Red程序代码中的所有变量、参数、函数等等文字,大小写都是一样的,例如print和Print或PRINT对于Red程序来说,都会认为是指同一个东西。当然,唯一需要记住的(目前)是,每一个Red代码的开头都要用“Red [”来开始,其中字母“R”必须大写,字母“ed”必须小写。


new-line characters are mostly ignored by Red interpreter.
—— characters 原型:character 名词复数形式 ['kar-ik-ter]['k?r?kt?] n. 字符
—— mostly 副词 ['mohst-lee]['m??stli] adv. 通常
—— ignored 原型:ignore 动词过去式 [ig-'nawr, -'nohr][?ɡ'n??] vt. 忽视;不理;不顾
—— interpreter 名词 [in-'tur-pri-ter][?n't??pr?t?] n. [计算机]解释程序,解释器

【解说】“new-line characters”是指回车换行符,相当于Windows系统中的“\r\n”或Linux系统中的“\n”等。换行符在Red语言代码中确实没什么用,理论上没有任何回车符也可以成为一段完整的代码,但加入回车换行符可以让代码看起来更清晰一些。


A relevant exception is a new-line inside a string.
—— inside 介词、从属连词 [preposition in-'sahyd, 'in-sahyd][??n'sa?d] adj. 里面的 adv. 在里面 n. 内部 prep. 在 ... 里面
—— string 名词 [string][str??] n. 字串,字符串

【解说】如果自己定义的或者从其他地方读取的字符串内容中含有回车换行符,当然是另一回事了,这是不可以省略的。

A Red program is a long chain of "words".
—— chain 名词 [cheyn][t?e?n] n. 链;(一)连串
Basically, these words may be either "data" or "actions".
—— Basically 原型:basically 副词 ['bey-sik-lee]['be?s?kli] adv. 基本上;主要地
—— data ['dey-tuh]['de?t?] n. 数据;资料;是名词datum ['dey-tuh?m]['de?t?m] 的复数形式


【解说】Red中所说的data,相当于其他语言中的变量或对象等数据,action则对应于其他语言中的函数、方法等。

"words" are separated by one or more whitespaces .
—— separated 原型:separate 动词过去分词 ['sep-uh-reyt]['sep?r?t] adj. 分开的;单独的;各自的 v. 分开;隔开

—— whitespace [wa?t?s'pe?s] 空白;空白字符


【解说】“word”是Red语言中的重要概念,简单地理解,程序代码中所有东西都可以看成word,我们在这里不给它一个中文说法,就是为了让大家保持英语思维。Red代码可以看成一串连续的word组成的,其中以空白字符(whitespace)分割,空白字符可以是空格、Tab或者回车换行等。


Red keeps a dictionary with predefined words (built-in functions) and user-created words.
—— predefined 过去分词做形容词 predefined [dih-'fahyn][pri?d?'fa?nd] adj. 预定义的;预先确定的
—— built-in 形容词 ['bilt-in][b?lt ?n] adj. 内置的;嵌入的 n. 嵌入式;内置
—— functions 原型:function 名词复数形式 ['fuhngk-shuh?n]['f??k?n] n. 功能;函数


【解说】如同其他语言一样,Red语言中也有保留字(关键字),用Red语言的思维来说,就是预定义(predefined)的word。而开发者自己定义的变量、函数等就是用户创建(user-created)的word了。

说明一下,虽然Red语言中的正式概念是word,但是从大多数编程开发者的固有理解出发,我们在后面的解说中,还是会以变量、函数、对象等更通行的说法来代替Red中的word、data、action等概念。


"words" may be grouped into "blocks" by enclosing them with brackets.
—— blocks 原型:block 名词复数形式 [blok][bl?k] n. 块;一组
—— enclosing 原型:enclose 动词现在进行式或动名词 [en-'klohz][?n'kl??z] vt. 圈起;围住
—— brackets 原型:bracket 名词复数形式 ['brak-it]['br?k?t] n. 括号,这里指方括号



"Blocks" are not necessarily routines, they are just a group of words that may, or may not, be evaluated by an "action".
—— necessarily 副词 [nes-uh-'sair-uh-lee, -'ser-][?nes?'ser?li] adv. 必然地;必定地;必需地
—— routines 原型:routine 名词复数形式 [roo-'teen][ru?'ti?n] n. 例行公事;常规
—— evaluated 原型:evaluate 动词过去分词 [ih-'val-yoo-eyt][?'v?ljue?t] vt. 计算;评价;评估


【解说】也就是说,用方括号可以把一组word组合起来,成为其他语言中的数组、序列等概念;另外,Red的中的字符串也可以看作一个序列,多个字符串也可以用方括号括起来表示其他语言中连接字符串或者字符串相加的动作。


Every word has a datatype.
—— datatype 名词 datatype [d?'t?ta?p] 数据类型



Red has a remarkably large number of datatypes.
—— remarkably 副词 [ri-'mahr-kuh-buhl][r?'mɑ?k?bli] adv. 显著突出地;出乎意外地


【解说】Red语言中确实有很多数据类型,语言内置的类型就有好几十个,这也是它比较有特色的地方,很快我们就将看到了。


最后,在进入代码之前,我们再说明一点:Red语言中的注释是用英语分号“;”开始的,本代码中也加入了很多注释,以便帮助理解;在入门阶段,这些注释尤为重要,请一定要看懂。


Red [] 
    ;所有Red程序代码必须以"Red["开始
    ;方括号内以后可以写程序的一些属性,现在可以暂时空着

argsT: system/options/args
    ; 获取命令行参数
    ; Red中赋值使用冒号“:”而不是“=”

prin ["^(line)命令行参数的类型是:" type? argsT]
    ; prin函数将在命令行输出信息
    ; ^是转义字符,^(line)表示回车
    ; 相当于其他语言中的转义字符\n
    ; type? 用于获取后面变量的类型
print [",长度是:" (length? argsT) ",具体内容是:"]
    ; print与prin的区别就是多输出一个换行字符
    ; length?用于获取后面一个变量的大小
    ; 这里获取的实际就是命令行参数的个数
probe argsT
    ; probe函数用来显示变量的内容

print  
    ; 输出一个空行

fileT: ""
    ; fileT用于存放文件(其实是文件名)
    ; Red中的file!文件型变量
    ; 这里定义fileT是为了让它成为全局变量

either (length? argsT) < 1 [
    ; 如果没有命令行参数,则argsT的长度为0
    fileT: request-file
        ; request-file将弹出一个图形化的文件选择框
] [
    fileT: to file! argsT/1
        ; 将命令行参数的第1个转换为文件类型的变量
        ; 原来的类型是字符串(string!)
        ; to 函数就是将后面的变量转换类型
        ; 它后面第一个参数是将要转换成的类型
        ; 第二个参数是与转换的变量
]
    ; either是Red中的if...else...
    ; Red中的if语句不可以带else条件分支

if fileT = none [
    ; 注意判断相等是用单个等号
    ; 与很多其他语言不同
    ; 如果
    print "没有选择任何文件" 
    quit
        ; quit函数用于退出程序
    ]

print ["待处理的文件是:" (type? fileT) fileT]
    ; 如果担心block中的顺序问题,可以用圆括号括起来

contentT: read/lines fileT
    ; read函数用于读取文件
    ; 加上斜杠和lines,是Red中独有的“细化”(refinement)方式
    ; 相当于给函数加一个参数
    ; 这里加上/lines表示按行读取文本
    ; 也就是读取到的文本内容将组成一个字符串数组

print ["^/" "文件" to string! fileT "的总行数是:" 
    to string! (length? contentT) ]
    ; ^/ 也是转义符,表示回车换行,与^(line)作用一样
    ; 另外,从本行可以发现,Red语言代码中换行与否不重要


如果上面的代码显示效果容易看不太清楚,下面是该段代码在支持语法高亮的编辑器(VS Code)中的显示效果。


如果还没有安装Red语言的,可以参看我们《(三语)Red语言的安装与简单上手》一文来进行快速安装。


将这段代码保存为countLine.red文件,然后执行这段程序的结果如下图所示:


我们使用了命令行方式来执行它,暂时不触及图形界面。加入--cli参数是为了不弹出图形化的Red语言交互式环境(REPL),第二个参数是“D:\redprjs\countLine\countLine.red”,这对于我们的程序来说其实是第一个参数,表示我们要获取我们这个代码本身文件的文本行数,当然我们也可以换成其他文本文件的名字来获取其他文件的行数。


程序的输出我们都看到了,正确地得到了该文件的文本行数。至此,我们了解了Red语言的基本概念和编程方法,已经可以开始下一步更深入的学习了。

## Tpyora 语法总结

[TOC]

> 说明:

>

> 这里只是列举了一些 Typora 的常用语法操作,一些高级用法 如 HTML标签、配置CSS 样式等这里没有过多涉及。想了解这一部分内容可以访问官网进行了解。

>

> 官网地址为: <https://www.typora.io/>

### 1. 基础语法

##### 1.1 标题

ctrl+数字(1-5) 可以设置一级标题到五级标题。

这种功能 多个# 也可以实现,一级标题一个#,五级标题五个#,以此类推。需要注意的是 # 与标题内容之间需要有 **空格**。

##### 1.2 文字格式

斜体: 如果一段文本的开头和结尾分别被 \* 包含,则这一段文本会被展示为 *斜体*。这个功能可以直接使用 ctrl+I 快捷键

> 这种斜体效果与 \_斜体\_ 等效,即下面两种的效果一样

>

> *斜体文本* (\*斜体文本\*)

>

> _斜体文本_ (\_斜体文本_)

粗体: 如果一段文本的开头和结尾分别被 \** 包含,则这一段文本会被展示为 **粗体**。这个功能可以直接使用 ctrl+B 快捷键

> 这种粗体效果 与 \_粗体\_ 等效,即下面两种的效果一样

>

> **粗体文本** (\*\*粗体文本\*\*)

>

> __粗体文本__ (\_\_粗体文本\_\_)

##### 1.3 引用

\> 之后的内容可以被当作引用内容,其效果如下所示:

> 这是引用内容

>

> > 这是嵌套第一层

> >

> > > 这是嵌套第二层

> > >

> > > [点击跳转...](https://www.baidu.com)

>语法说明如下。

>

>1. 多行引用也可以在每一行的开头都插入 >。

>

>2. 在引用中可以嵌套引用。

>

>3. 在引用中可以使用其他的Markdown语法。

>

>4. 段落与换行的格式在引用中也是适用的。

##### 1.4 插入代码

###### 1. 插入代码块

\``` 之后紧接着追加语言,可以针对不同的语言进行高亮展示

例:

```

yBatis 本是apache的一个开源项目iBatis,支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。下面为大家说一说在Mybatis映射配置文件xml中如何处理大于号,小于号等特殊符号的。

其一:比较简单实用的方式,直接转译了即可,如下面SQL语句

SELECT * FROM Table WHERE 1=1 AND startDate &lt;=nowDate AND endDate &gt;=nowDate

附:XML转义字符具体如下:

&lt; < 小于号

&gt; > 大于号

&amp; & 和

&apos; ’ 单引号

&quot; " 双引号

其二:映射配置文件xml中时不允许出现类似“>”这样的字符, Mybatis自身支持的<![CDATA[ ]]>符号,可以通过此类符号不进行解析 。

SQL语句如下:

SELECT * FROM Table WHERE 1=1 AND

start_date<![CDATA>=]]>

‘2016-11-23’ AND

end_date <![CDATA[<=]]>

’2016-12-16’

<![CDATA[ ]]>符号说明:

1)CDATA区域是由“<![CDATA["为开始标记,以“]]>”为结束标记,注意CDATA必须大写

2)<![CDATA[文本内容]]> CDATA的文本内容中不能出现字符串,并且CDATA不能嵌套使用

3)在CDATA标记中的信息被解析器原封不动地传给应用程序,并且不解析该段信息中的任何控制标记