为什么两种执行 Juilia 程序的方式会给出不同的结果?

Why two styles of executing Juilia programs are giving different results?

如果 运行 一个用 julia 编写的程序

sachin@localhost:$ julia mettis.jl 然后它 运行 成功了,没有打印任何东西,尽管其中有一个打印语句。

其次,如果 运行 进入朱莉娅:

sachin@localhost:$ julia
julia> include("mettis.jl")
main (generic function with 1 method)`
julia> main()

然后它给出了一些错误。

我很困惑为什么两种执行方式会给出不同的结果?

这是我的代码:

using ITensors
using Printf
function ITensors.op(::OpName"expτSS", ::SiteType"S=1/2", s1::Index, s2::Index; τ)
h =
1 / 2 * op("S+", s1) * op("S-", s2) +
1 / 2 * op("S-", s1) * op("S+", s2) +
op("Sz", s1) * op("Sz", s2)
return exp(τ * h)
end

function main(; N=10, cutoff=1E-8, δτ=0.1, beta_max=2.0)

# Make an array of 'site' indices
s = siteinds("S=1/2", N; conserve_qns=true)
#  @show s
# Make gates (1,2),(2,3),(3,4),...
 gates = ops([("expτSS", (n, n + 1), (τ=-δτ / 2,)) for n in 1:(N - 1)], s)
 # Include gates in reverse order to complete Trotter formula
 append!(gates, reverse(gates))

 # Initial state is infinite-temperature mixed state
 rho = MPO(s, "Id") ./ √2
 @show inner(rho, H)
 # Make H for measuring the energy
 terms = OpSum()
 for j in 1:(N - 1)
  terms += 1 / 2, "S+", j, "S-", j + 1
   terms += 1 / 2, "S-", j, "S+", j + 1
  terms += "Sz", j, "Sz", j + 1
end
H = MPO(terms, s)

# Do the time evolution by applying the gates
# for Nsteps steps
for β in 0:δτ:beta_max
  energy = inner(rho, H)
  @printf("β = %.2f energy = %.8f\n", β, energy)
  rho = apply(gates, rho; cutoff)main
  rho = rho / tr(rho)
end
#  @show energy
 return nothing
end

Julia 中名为 main 的函数没有什么特别之处,定义函数与调用函数不同。因此,文件 mettis.jl 包含以下代码:

function main()
    println("Hello, World!")
end

在 运行 (julia mettis.jl) 时不会“做”任何事情。但是,如果您实际上在最后调用该函数:

function main()
    println("Hello, World!")
end
main()

你得到了预期的结果

$ julia mettis.jl
Hello, World!