Erlang语言精要
Erlang shell
相较于日常惯用的系统,Erlang系统是一套更富交互性的环境。使用大部分编程语言时,要么把程序编译成OS可执行文件后运行,要么用解释器来执行一堆脚本文件或编译后的字节码文件。无论哪种情况,都是让程序一路跑到结束或崩溃为止,然后回到操作系统环境中,再重复这个过程。
Erlang却不是这样,它更像是在操作系统中运行着的另一个操作系统。虽然Erlang的启动速度很快,但它并非被设计用于需要频繁启停的场合—它被设计用于持续运行,是为交互式开发、调试和升级而设计的。理想情况下,只有碰到硬件故障、操作系统升级之类的情况才有必要重启Erlang。
与Erlang系统的交互主要是在shell中进行的。shell就是你的指挥中心。
启动shell
我们假设你已经下载并安装了Erlang/OTP。如果你用的是Linux、Mac OSX,或其他类UNIX系统,启动一个终端并运行erl命令即可。如果你在用Windows,你应该点击安装程序替你生成的Erlang图标,随后会启动名为werl的程序,它会打开一个特殊的Erlang终端,这样做可以避免直接在Windows终端下交互式运行erl会碰到的一些问题。
输入表达式
首先,你在shell提示符下输入的并不是什么命令,而是表达式,两者的区别在于表达式一定会返回一个求值结果。表达式求值完毕后,shell就会打印出求值结果。shell会记住这些结果,后续可以用v(1)、v(2)这样的语法来引用它们。比如,输人数值42,紧跟一个英文句号(.),再回车,你将看到:
1>42.
42
2>
敲下回车后,Erlang会对表达式42求值,并打印求值结果(数值42),最后给出一个新的提示符,编号为2。不过为什么要在42后面加上一个句号呢?
1.以句号结束
在敲下回车之前,必须用句点告诉shell表达式已输入完毕。如果不输人句号就回车,shell会一直提示你输入更多字符(提示符编号不会增加),就像这样:
2>12
2> + 5
2>.
17
3>
要是一开始忘了句号,不用担心,补上之后敲回车就行了。可以看到,这个简单的算术表达式的求值结果仍与预期相符。现在,我们来试着取回先前的求值结果:
3>v(1).
42
4>v(2).
17
5>v(2) + v(3).
59
6>
2.输入带引号的字符串
当你输人双引号或单引号字符串时(现在先不讨论二者的区别),有一个特别值得注意的问题,如果忘了结尾的引号就敲了回车,shell会把同样的提示符再打印一遍并继续等待更多输人,这跟上一个忘记句号的例子差不多。如果碰到这个情况,可以输入匹配的引号并跟上一个句号,再敲回车。例如,像这样:
1>"hello there.
1>
这里的句号并不是这个字符串结束的标志一它是字符串的一部分。为了让shell从这个状态中恢复过来,你需要加些内容来结束这个字符串:
1>".
"hello there. \n"
2>
注意最终的字符串中包含一个句号和一个换行符,而这多半不是你想要的结果。你可以用上方向键或Ctrl-P找回那行并重新编辑,在正确的位置插人遗漏的引号:
2>"hello there".
"hello there"
3>v(2).
"hello there"
4>
shell函数
在Erlang中有一类像v(N)这样的函数,它们只存在于shell中。这些shell函数的名字通常很短(也比较晦涩)。要获取完整的shell函数清单,可以输人help()(具本身也是一个Shell函数)。
退出shell
退出shell(并停止整个Erlang系统)的方法有好几种:
1.调用q()或init: stop ()
最安全的方法就是运行上一节提到过的shell函数q()。这是init:stop()函数的一个简写形式(你也可以直接调用这个函数),该函数以一种可控的方式关闭整个Erlang系统,它会通知正在运行的应用停止运行并给它们预留出响应时间。通常这个过程几秒内就可以完成,但线上系统可能需要花费更多的时间来完成各种清理工作。
2.BREAK菜单
如果急着退出而运行的东西也不重要,在类UNIX系统中你可以按Ctrl-C唤出底层的BREAK菜单,Windows下可以在werl终端下用Ctrl-Break唤出该菜单。它看起来是这样的
其中我们感兴趣的选项是(a)退出系统(硬停机)、(c)返回shell,和(v)打印当前运行的Erlang的版本。其他选项则会打印出计夕尔北记大HJn对大部活动乃至强制关闭任何故障进程,这些信息对调试很有用;(k)还可以让你浏览所有Erlang内部活动乃至强制关闭任何故障进程,前提是你明确知道自己在做什么。注意shell本身感知不到BREAK菜单,因此当你用(c)返回shell时,还得再按一次回车提示符才会刷新。
3.Ctrl-G
第三个同时也是最有用的一个退出方法就是用Ctrl-G唤出用户开关命令菜单。这么做会令Erlang输出这么一段晦涩的文字:
键入h或?并回车,你将看到以下的清单:
在提示符-->下键人c可以返巳shell 键入q会硬停机,就跟BREAK菜单下的(a)一样——别把这个a跟shell函数q( )弄混! 后者对系统更友好。另外注意BREAK菜单位居更底层,你可以在Ctrl-G菜单中唤出BREAK菜单,反之则不行。