Julia 编辑器 Atom 插件 Juno

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mifangdebaise/article/details/82874633

安装

  1. Julia 在 Atom 中的插件 Juno,需要安装 inkjulia-clientlanguage-julia. 其中 ink 和 julia-client 可以参见 github-Juno. 另外需要在 Juno 界面的右侧显示出调试的工具栏,可能还需要另外的插件 uber-juno.
  2. Atom下不小心进入全屏后按 Alt+v 可以调出菜单栏.
  3. 安装好 Juno 后关于 Julia 的一些设定,可以在 菜单栏->Packages->Julia 中找,包括在 Juno 下打开 Julia REPL:Packages->Julia->Open Console.


Juno 中的问题

Juno 中有没有跳转函数的功能,就是类似于 matlab 中可以直接从一个函数中跳转到自己选定的那个函数中。 或者 Julia 中的编辑器中哪个有这个功能呢?

这个问题可以参见自己的一个提问:Juno 中有没有跳转到指定函数的功能
这里总结一下:
在 Juno 中 REPL 环境中,可以用 @edit 宏来(用当前默认的编辑器)打开,需要注意的是 Julia 里的函数都是 generic 的,同名函数有很多方法,所以 @edit sin() 会出错,需要指定具体的参数类别,@edit sin(2) 是正确调用

julia> @edit sin()
ERROR: no unique matching method found for the specified argument types
Stacktrace:
[1] error(::String) at ./error.jl:33
[2] which(::Any, ::Any) at ./reflection.jl:922
[3] functionloc at ./reflection.jl:967 [inlined]
[4] edit(::Function, ::Any) at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.0/InteractiveUtils/src/editless.jl:93
[5] top-level scope at none:0
julia> @edit sin(2)

还可以用 @which,methods 和 Ctrl+Q 配合起来从 REPL 里跳,具体是:在 REPL 里的报错或者 method 前面都会有标号 [*]:

julia> methods(gcd)
# 8 methods for generic function "gcd":
[1] gcd(x::BigInt, y::BigInt) in Base.GMP at gmp.jl:412
[2] gcd(a::T, b::T) where T<:Union{Int128, Int16, Int32, Int64, Int8, UInt128, UInt16, UInt32, UInt64, UInt8} in Base at intfuncs.jl:31
[3] gcd(a::Integer) in Base at intfuncs.jl:75
[4] gcd(a::T, b::T) where T<:Integer in Base at intfuncs.jl:20
[5] gcd(a::Integer, b::Integer) in Base at intfuncs.jl:77

这时在 REPL 里输入对应标号,比如 1, 然后按 Ctrl+Q, Julia 会自动用默认编辑器打开,从某种程度上减少了 @edit 的麻烦。

关于 Atom Juno 工程文件的路径问题

这个问题的具体描述也可以参见这个提问:关于 Atom Juno 工程文件的路径问题
这里总结一下:
假如我有两个工程文件 proj1 和 proj2,以及在 proj2 中有一些 jl 和 dat 文件,文件具体放置的路径如下

/home/myJulia/proj1/
/home/myJulia/proj2/A/ main.jl
/home/myJulia/proj2/B/ b1.jl
/home/myJulia/proj2/C/ c1.dat

在 Juno 中我分别 Add Project Folder – proj1 proj2,注意这时的顺序是 proj1 在 proj2 上面:
在这里插入图片描述

我想在 proj2 的 main.jl 添加路径

push!(LOAD_PATH,"../")

目的想把整个 proj2 的目录都添加进去,但是,为什么在此时 Juno 下打开 main.jl,Juno 的 REPL 中用 pwd() 输出的却是 proj1 的目录?

julia> pwd()
"/home/myJulia/proj1"

这说明 Juno 下 Julia-REPL 工作目录确实是第一个工程文件的目录,但是

根据问题关于 Atom Juno 工程文件的路径问题答案

pwd 是当前工作目录,如果没有使用 cd 等操作来改动这个系统状态,它是不会更改的。 我们想要的是当前文件/文件夹的相对路径,在 Julia 中可以使用 @DIR 或 dirname(@FILE):

# 在 main.jl 中 include b1.jl
include(joinpath(@__DIR__, "..", "..", "proj2", "B", "b1.jl"))

当前工作目录是一个随时可以改变的状态,为了尽量让代码与系统状态[1]解耦合,建议使用上述方法。另外,push!(LOAD_PATH) 在现有的包管理机制下应该可以避免,看起来像是在滥用。
[1]: 这里说的系统状态不包括代码的文件结构,举个例子,git 等 SCM 工具可以记录文件结构,但不会记录 pwd.

另外想补充的是 Julia-REPL 中可以用 cd() 命令来转入 .julia 所在的目录下 (/home/username/),另用 joinpath(@__DIR__, …) 来将所需文件进行添加.

eval 函数和 @eval 宏

这问题在 怎样在在其它模块中创建变量? 中解释了一下,贴过来:
模块 中 eval (以及 @eval 宏) 和 include 函数的解释我还是不理解,可以再解释一下么?

help?> eval
search: eval evalfile @eval @evalpoly bytesavailable readavailable TypeVar

  eval(expr)

  Evaluate an expression in the global scope of the containing module. Every
  Module (except those defined with baremodule) has its own 1-argument
  definition of eval, which evaluates expressions in that module.

还有

help?> @eval
  @eval [mod,] ex

  Evaluate an expression with values interpolated into it using eval. If two
  arguments are provided, the first is the module to evaluate in.

参考回答:

include 就和 C++ 的用法一样,相当于复制粘贴代码。
eval 是在运行时动态执行代码。
eval 是在其被包含的那个 module 里执行代码,想在其它 module 里执行代码,用 Core.eval(module_name, expr)。
@eval 是个方便使用的宏,一个参数的时候默认调用 eval, 两个的时候调用 Core.eval。



Juno 中自己发现的一些小用法

在 Juno 中打开 jl 文件

如果在 Juno 中添加了一个 project,里面有 aa.jl, bb.jl, cc.jl,想打开里面的文件,比如 aa.jl

  • 如果鼠标左键单击 aa.jl,这时 aa.jl 窗口的标题栏是 斜体,如果此时再单击 bb.jl 时,bb.jl 窗口会覆盖掉 aa.jl 的窗口.
  • 如果鼠标左键双击 aa.jl,这时 aa.jl 窗口的标题栏是 正体,如果此时再单击 bb.jl 时,bb.jl 会新建一个窗口显示.

猜你喜欢

转载自blog.csdn.net/mifangdebaise/article/details/82874633