1.5 使用REPL
Read-Eval-Print-Loop(REPL)是一个交互式shell,类似于Python或Swift的Playground,提供了测试代码片段的功能。Julia在后端提供了一个带有JIT编译器(由Julia使用)的交互式shell。我们可以在一行中输入、编译,结果在下一行中给出。Julia命令行界面如图1-13所示。
图1-13 Julia命令行界面
只要在终端键入julia,就可以轻松启动Julia的shell。在打开shell时,会显示Julia标志和有关版本的信息。这里的“julia>”是Julia提示符,类似于Python中的“>>>”,我们可以在其后面编写表达式、语句和函数,就像在代码文件中编写一样。REPL的好处是可以测试代码是否存在错误,适合初学者快速上手。另外,Julia包或自定义编写的Julia程序可以使用include包含在REPL中。接下来,我们打开文本编辑器来编写第一个Julia程序,具体如范例1-1所示。
【范例1-1】第一个Julia程序
这里定义了一个helloworld函数,为后面include包含命令的测试做准备。
01 function helloworld() 02 println("你好Julia") 03 end
代码01行定义了一个helloworld函数,02行调用了println函数输出数据,03行的end用来标记函数结束。
我们将其保存为名为hello.jl的文件。现在不用纠结于具体的语法,这里仅仅定义了一个函数并让其输出一行“你好Julia”。接下来,在REPL中将这个文件包含进来,并调用其中的函数,具体如图1-14所示。
图1-14 在REPL中包含Julia文件
这里通过include函数将hello.jl包含进来,路径视存储hello.jl文件的位置而定。在包含文件之后,我们就可以在REPL中调用在该文件中定义的函数了。
当在REPL中包含文件时,可以看到它提供了有关文件中函数的信息,我们可以使用该功能将文件中所有函数的信息都打印到终端。Julia还会将所有在REPL中编写的命令存储在.juliahistory文件夹中,它位于Windows上的C:\Users\%username%目录或者Linux和macOS上的~/.juliahistory目录下。这一点与Linux终端类似,我们可以在Julia的shell中使用“Ctrl+R”组合键进行反向搜索,来找到之前执行过的命令。
1.5.1 在Julia中使用帮助
在Julia的REPL中还提供了一个功能,即帮助手册(help),我们可以通过从键盘输入“?”字符来使用这个功能。在输入“?”后提示符将更改为:
help?>
它提供Julia中函数、类型、宏以及运算符等的详细信息。比如让它显示我们刚刚使用过的include函数信息,如图1-15所示。
Julia还提供了使用REPL常规shell命令的功能,我们可以通过从键盘输入“;”字符来使用REPL中的shell。在输入“;”后提示符将更改为:
shell>
这里尝试使用ls命令(在Windows中是dir)列出当前目录中的文件,并尝试通过ping与baidu.com进行数据通信,如图1-16所示。通过REPL的这个特性,不用离开Julia就可以完成那些需要在终端完成的任务。
图1-15 include函数信息
图1-16 在Julia中使用shell
在Julia中还有一些交互式功能和宏,利用它们可以显著地提高编码效率,进而提升生产力。下面列出其中几个比较有代表性的功能和宏。
• varinfo():显示当前存在的全局符号信息,如图1-17所示。
图1-17 使用varinfo显示全局符号信息
• @which:显示函数定义的具体信息。比如下面的代码,在代码01行中,通过which命令来查询sin函数的具体信息,02行显示的就是sin函数的具体信息结果,包括函数名、参数类型、声明位置等。
01 julia> @which sin(10) 02 sin(x::Real) at math.jl:204
• versioninfo():在启动Julia REPL时,显示一部分版本信息,如果想了解更详细的信息,则可以使用versioninfo()。比如下面的代码,在代码01行中,我们调用了该函数,02~09行均为显示结果。其中02行显示了所使用的Julia版本,05行显示了计算机的系统信息,06行显示了计算机的CPU信息等。
01 julia> versioninfo() 02 Julia Version 0.7.0 03 Commit a4cb80f3ed (2018-08-08 06:46 UTC) 04 Platform Info: 05 OS: macOS (x86_64-apple-darwin14.5.0) 06 CPU: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz 07 WORD_SIZE: 64 08 LIBM: libopenlibm 09 LLVM: libLLVM-6.0.0 (ORCJIT, skylake)
• edit("anyfileinhomedirectory"):用于编辑主目录中的文件。默认打开的编辑器会根据所使用的操作系统而不同,比如在macOS中默认打开的是vim。
• less("anyfileinsamedirectory"):其类似于在shell中将文件显示出来的应用程序。
• clipboard("some_text"):可以将一些信息复制到系统的剪贴板中。
• clipboard():可以将键盘内容粘贴到REPL中。在将一些命令从其他地方复制到REPL中时它很有用。
• dump():在屏幕上显示Julia对象的信息。
• workspace():擦除我们之前声明的所有变量,创造一个全新的、干净的工作区。
1.5.2 REPL中的图表
REPL的功能十分强大,甚至可以在REPL中创建图表——虽然只是一些很简单的图表,但看起来相当不错,并且仅占用少量的资源。要实现这个功能,需要添加一个包。我们可以通过下面这行代码,添加绘图所需要的包。
julia> Pkg.add("UnicodePlots")
UnicodePlots包由Christof Stocker提供。现在我们就用这个包来绘制一个简单的图表,如图1-18所示。
图1-18 在REPL中绘制图表
我们可以使用UnicodePlots包创建很多类似的图表,例如散点图、线图、直方图等。在后面有关数据可视化的章节中,我们会介绍更多、更强大的绘图包,用来处理更复杂的数据。