* 本系列是“2+1”三语学编程系列,三语是英文、中文加计算机语言;即用英语来学习编程语言,并以中文为辅助;
* 用英语来理解和学习计算机语言是最好的方式,这一系列的文章力求帮助大家在计算机语言上和英语阅读能力上都有所提升;
* 推荐的阅读的方法是:先原文,适当看解析阅读,实在不行再看双语对照。* 解析中英语单词的音标使用Dictcom和IPA双音标标注,如果需要了解Dictcom音标,请参看我们的《dictionary.com所用的音标体系》一文。
Red语言是一门轻巧、便捷而又高效的编程语言,它非常吸引人的特性包括:
- 主程序只有一个文件,无需安装,但居然也能提供交互式环境编程,能够解释运行,也能够编译运行,并且还能够跨平台编译(甚至可以直接跨平台编译到Android系统);
- 提供语言级上的、方便的原生图形化界面(GUI)编程能力,几句话就能搭建一个功能完整的图形界面,这是大多数其他主流语言都没有做到的;
- 自嵌入脚本能力,Red编写的程序,自己就可以解释执行其他的Red代码,这对于编译型的语言来说一般是不具备的能力;
- 自带的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系统中的“”或Linux系统中的“”等。换行符在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)表示回车 ; 相当于其他语言中的转义字符 ; type? 用于获取后面变量的类型print [",长度是:" (length? argsT) ",具体内容是:"] ; print与prin的区别就是多输出一个换行字符 ; length?用于获取后面一个变量的大小 ; 这里获取的实际就是命令行参数的个数probe argsT ; probe函数用来显示变量的内容print ; 输出一个空行fileT: "" ; fileT用于存放文件(其实是文件名) ; Red中的file!文件型变量 ; 这里定义fileT是为了让它成为全局变量either (length? argsT)
如果上面的代码显示效果容易看不太清楚,下面是该段代码在支持语法高亮的编辑器(VS Code)中的显示效果。
如果还没有安装Red语言的,可以参看我们《(三语)Red语言的安装与简单上手》一文来进行快速安装。
将这段代码保存为countLine.red文件,然后执行这段程序的结果如下图所示:
我们使用了命令行方式来执行它,暂时不触及图形界面。加入--cli参数是为了不弹出图形化的Red语言交互式环境(REPL),第二个参数是“D:edprjscountLinecountLine.red”,这对于我们的程序来说其实是第一个参数,表示我们要获取我们这个代码本身文件的文本行数,当然我们也可以换成其他文本文件的名字来获取其他文件的行数。
程序的输出我们都看到了,正确地得到了该文件的文本行数。至此,我们了解了Red语言的基本概念和编程方法,已经可以开始下一步更深入的学习了。