From 0089e4b8bb3ce57a5a4d3674ec6c4cfa7fb80713 Mon Sep 17 00:00:00 2001 From: Shuhei Kadowaki <40514306+aviatesk@users.noreply.github.com> Date: Sat, 6 Jan 2024 11:19:41 +0900 Subject: [PATCH] update docs and convert `jldoctest` to `@repl` blocks (#607) Doctest is very fragile. Using `@repl`, we can update documentation automatically. --- .gitattributes | 1 + docs/Manifest.toml | 193 +++++++++++++++++++++++++++++++++++++----- docs/make.jl | 1 - docs/src/index.md | 151 +++++++++++---------------------- docs/src/internals.md | 16 ++-- src/construct.jl | 26 ++---- 6 files changed, 237 insertions(+), 151 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..4d88c69c --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +docs/Manifest.toml linguist-generated=true diff --git a/docs/Manifest.toml b/docs/Manifest.toml index fad80f8f..f060196a 100644 --- a/docs/Manifest.toml +++ b/docs/Manifest.toml @@ -1,6 +1,6 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.8.2" +julia_version = "1.10.0" manifest_format = "2.0" project_hash = "f8f17ea8030e6083899e9cc89b9b04cd28b94813" @@ -9,14 +9,26 @@ git-tree-sha1 = "574baf8110975760d391c710b6341da1afa48d8c" uuid = "a4c015fc-c6ff-483c-b24f-f7ea428134e9" version = "0.0.1" +[[deps.AbstractTrees]] +git-tree-sha1 = "faa260e4cb5aba097a73fab382dd4b5819d8ec8c" +uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" +version = "0.4.4" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.1" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + [[deps.Base64]] uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" [[deps.CodeTracking]] deps = ["InteractiveUtils", "UUIDs"] -git-tree-sha1 = "cc4bd91eba9cdbbb4df4746124c22c0832a460d6" +git-tree-sha1 = "c0216e792f518b39b22212127d4a84dc31e4e386" uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" -version = "1.1.1" +version = "1.3.5" [[deps.Dates]] deps = ["Printf"] @@ -24,42 +36,108 @@ uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" [[deps.DocStringExtensions]] deps = ["LibGit2"] -git-tree-sha1 = "c36550cb29cbe373e95b3f40486b9a4148f89ffd" +git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" -version = "0.9.2" +version = "0.9.3" [[deps.Documenter]] -deps = ["ANSIColoredPrinters", "Base64", "Dates", "DocStringExtensions", "IOCapture", "InteractiveUtils", "JSON", "LibGit2", "Logging", "Markdown", "REPL", "Test", "Unicode"] -git-tree-sha1 = "6030186b00a38e9d0434518627426570aac2ef95" +deps = ["ANSIColoredPrinters", "AbstractTrees", "Base64", "Dates", "DocStringExtensions", "Downloads", "Git", "IOCapture", "InteractiveUtils", "JSON", "LibGit2", "Logging", "Markdown", "MarkdownAST", "Pkg", "PrecompileTools", "REPL", "RegistryInstances", "SHA", "Test", "Unicode"] +git-tree-sha1 = "2613dbec8f4748273bbe30ba71fd5cb369966bac" uuid = "e30172f5-a6a5-5a46-863b-614d45cd2de4" -version = "0.27.23" +version = "1.2.1" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "4558ab818dcceaab612d1bb8c19cee87eda2b83c" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.5.0+0" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.Git]] +deps = ["Git_jll"] +git-tree-sha1 = "51764e6c2e84c37055e846c516e9015b4a291c7d" +uuid = "d7ba0133-e1db-5d97-8f8c-041e4b3a1eb2" +version = "1.3.0" + +[[deps.Git_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "Libiconv_jll", "OpenSSL_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "bb8f7cc77ec1152414b2af6db533d9471cfbb2d1" +uuid = "f8c6e375-362e-5223-8a59-34ff63f689eb" +version = "2.42.0+0" [[deps.IOCapture]] deps = ["Logging", "Random"] -git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +git-tree-sha1 = "d75853a0bdbfb1ac815478bacd89cd27b550ace6" uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" -version = "0.2.2" +version = "0.2.3" [[deps.InteractiveUtils]] deps = ["Markdown"] uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.5.0" + [[deps.JSON]] deps = ["Dates", "Mmap", "Parsers", "Unicode"] -git-tree-sha1 = "3c837543ddb02250ef42f4738347454f95079d4e" +git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" -version = "0.21.3" +version = "0.21.4" [[deps.JuliaInterpreter]] deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] path = ".." uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" -version = "0.9.15" +version = "0.9.27" + +[[deps.LazilyInitializedFields]] +git-tree-sha1 = "8f7f3cabab0fd1800699663533b6d5cb3fc0e612" +uuid = "0e77f7df-68c5-4e49-93ce-4cd80f5598bf" +version = "1.2.2" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.4.0+0" [[deps.LibGit2]] -deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.6.4+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.0+1" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.17.0+0" + [[deps.Logging]] uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" @@ -67,18 +145,61 @@ uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" deps = ["Base64"] uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" +[[deps.MarkdownAST]] +deps = ["AbstractTrees", "Markdown"] +git-tree-sha1 = "465a70f0fc7d443a00dcdc3267a497397b8a3899" +uuid = "d0879d2d-cac2-40c8-9cee-1863dc0c7391" +version = "0.1.2" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.2+1" + [[deps.Mmap]] uuid = "a63ad114-7e13-5084-954f-fe012c677804" +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2023.1.10" + [[deps.NetworkOptions]] uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" version = "1.2.0" +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "cc6e1927ac521b659af340e0ca45828a3ffc748f" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.0.12+0" + +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+1" + [[deps.Parsers]] -deps = ["Dates", "SnoopPrecompile"] -git-tree-sha1 = "cceb0257b662528ecdf0b4b4302eb00e767b38e7" +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" -version = "2.5.0" +version = "2.8.1" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.10.0" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "03b4c25b43cb84cee5c90aa9b5ea0a78fd848d2f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.0" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "00805cd429dcb4870060ff49ef443486c262e38e" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.1" [[deps.Printf]] deps = ["Unicode"] @@ -89,9 +210,15 @@ deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" [[deps.Random]] -deps = ["SHA", "Serialization"] +deps = ["SHA"] uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +[[deps.RegistryInstances]] +deps = ["LazilyInitializedFields", "Pkg", "TOML", "Tar"] +git-tree-sha1 = "ffd19052caf598b8653b99404058fce14828be51" +uuid = "2792f1a3-b283-48e8-9a74-f99dce5104f3" +version = "0.1.0" + [[deps.SHA]] uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" version = "0.7.0" @@ -99,14 +226,19 @@ version = "0.7.0" [[deps.Serialization]] uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" -[[deps.SnoopPrecompile]] -git-tree-sha1 = "f604441450a3c0569830946e5b33b78c928e1a85" -uuid = "66db9d55-30c0-4569-8b51-7e840670fc0c" -version = "1.0.1" - [[deps.Sockets]] uuid = "6462fe0b-24de-5631-8697-dd941f90decc" +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + [[deps.Test]] deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" @@ -117,3 +249,18 @@ uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" [[deps.Unicode]] uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+1" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.52.0+1" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+2" diff --git a/docs/make.jl b/docs/make.jl index ded47914..5cd2b345 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -10,7 +10,6 @@ DocMeta.setdocmeta!(JuliaInterpreter, :DocTestSetup, :( makedocs( modules = [JuliaInterpreter], clean = false, - strict = true, format = Documenter.HTML(prettyurls = get(ENV, "CI", nothing) == "true"), sitename = "JuliaInterpreter.jl", authors = "Keno Fischer, Tim Holy, Kristoffer Carlsson, and others", diff --git a/docs/src/index.md b/docs/src/index.md index 1b6edeab..87c36164 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -9,20 +9,14 @@ Interpreters have a number of applications, including support for stepping debug Using this package as an interpreter is straightforward: -```jldoctest demo1 -julia> using JuliaInterpreter +```@repl index +using JuliaInterpreter -julia> list = [1, 2, 5] -3-element Vector{Int64}: - 1 - 2 - 5 +list = [1, 2, 5] -julia> sum(list) -8 +sum(list) -julia> @interpret sum(list) -8 +@interpret sum(list) ``` ## Breakpoints @@ -37,8 +31,8 @@ so here we'll illustrate it without using any of these other packages. Let's set a conditional breakpoint, to be triggered any time one of the elements in the argument to `sum` is bigger than 4: -```jldoctest demo1; filter = r"in Base at .*$" -julia> bp = @breakpoint sum([1, 2]) any(x->x>4, a); +```@repl index +bp = @breakpoint sum([1, 2]) any(x->x>4, a); ``` Note that in writing the condition, we used `a`, the name of the argument to the relevant @@ -48,17 +42,10 @@ globally-available name (as used here with the `any` function). Now let's see what happens: -```jldoctest demo1; filter = [r"in Base at .*$", r"[^\d]\d\d\d[^\d]", r"(c 1|d 1)"] -julia> @interpret sum([1,2,3]) # no element bigger than 4, breakpoint should not trigger -6 - -julia> frame, bpref = @interpret sum([1,2,5]) # should trigger breakpoint -(Frame for sum(a::AbstractArray; dims, kw...) @ Base reducedim.jl:994 -c 1* 994 1 ─ nothing - 2 994 │ %2 = $(QuoteNode(Colon())) - 3 994 │ %3 = ($(QuoteNode(NamedTuple)))() -⋮ -a = [1, 2, 5], breakpoint(sum(a::AbstractArray; dims, kw...) @ Base reducedim.jl:994, line 994)) +```@repl index +@interpret sum([1,2,3]) # no element bigger than 4, breakpoint should not trigger + +frame, bpref = @interpret sum([1,2,5]) # should trigger breakpoint ``` `frame` is described in more detail on the next page; for now, suffice it to say @@ -66,21 +53,14 @@ that the `c` in the leftmost column indicates the presence of a conditional brea upon entry to `sum`. `bpref` is a reference to the breakpoint of type [`BreakpointRef`](@ref). The breakpoint `bp` we created can be manipulated at the command line -```jldoctest demo1; filter = [r"in Base at .*$", r"[^\d]\d\d\d[^\d]", r"(c 1|d 1)"] -julia> disable(bp) +```@repl index +disable(bp) -julia> @interpret sum([1,2,5]) -8 +@interpret sum([1,2,5]) -julia> enable(bp) +enable(bp) -julia> @interpret sum([1,2,5]) -(Frame for sum(a::AbstractArray; dims, kw...) @ Base reducedim.jl:994 -c 1* 994 1 ─ nothing - 2 994 │ %2 = $(QuoteNode(Colon())) - 3 994 │ %3 = ($(QuoteNode(NamedTuple)))() -⋮ -a = [1, 2, 5], breakpoint(sum(a::AbstractArray; dims, kw...) @ Base reducedim.jl:994, line 994)) +@interpret sum([1,2,5]) ``` [`disable`](@ref) and [`enable`](@ref) allow you to turn breakpoints off and on without losing any @@ -96,76 +76,43 @@ At present, note that some of this functionality requires that you be running It is, in addition, possible to halt execution when otherwise an error would be thrown. This functionality is enabled using [`break_on`](@ref) and disabled with [`break_off`](@ref): -```jldoctest demo1; filter=r"none:\d" -julia> function f_outer() - println("before error") - f_inner() - println("after error") - end; - -julia> f_inner() = error("inner error"); - -julia> break_on(:error) - -julia> fr, pc = @interpret f_outer() -before error -(Frame for f_outer() @ Main none:1 - 1 2 1 ─ Base.println("before error") - 2* 3 │ f_inner() - 3 4 │ %3 = Base.println("after error") - 4 4 └── return %3 -callee: f_inner() @ Main none:1, breakpoint(error(s::AbstractString) @ Base error.jl:35, line 35, ErrorException("inner error"))) - -julia> leaf(fr) -Frame for error(s::AbstractString) @ Base error.jl:35 - 1 35 1 ─ %1 = ($(QuoteNode(ErrorException)))(s) - 2* 35 │ %2 = Core.throw(%1) - 3 35 └── return %2 -s = "inner error" -caller: f_inner() @ Main none:1 - -julia> typeof(pc) -BreakpointRef - -julia> pc.err -ErrorException("inner error") - -julia> break_off(:error) - -julia> @interpret f_outer() -before error -ERROR: inner error -Stacktrace: -[...] +```@repl index +function f_outer() + println("before error") + f_inner() + println("after error") +end; + +f_inner() = error("inner error"); + +break_on(:error) + +fr, pc = @interpret f_outer() + +leaf(fr) + +typeof(pc) + +pc.err + +break_off(:error) + +@interpret f_outer() ``` Finally, you can set breakpoints using [`@bp`](@ref): -```jldoctest demo1; filter=r"none:\d" -julia> function myfunction(x, y) - a = 1 - b = 2 - x > 3 && @bp - return a + b + x + y - end -myfunction (generic function with 1 method) - -julia> @interpret myfunction(1, 2) -6 - -julia> @interpret myfunction(5, 6) -(Frame for myfunction(x, y) @ Main none:1 -⋮ - 3 4 │ %3 = x > 3 - 4 4 └── goto #3 if not %3 -b 5* 4 2 ─ nothing - 6 4 └── goto #3 - 7 5 3 ┄ %7 = a + b + x + y -⋮ -x = 5 -y = 6 -b = 2 -a = 1, breakpoint(myfunction(x, y) @ Main none:1, line 4)) +```@repl index +function myfunction(x, y) + a = 1 + b = 2 + x > 3 && @bp + return a + b + x + y +end; + +@interpret myfunction(1, 2) + +@interpret myfunction(5, 6) ``` Here the breakpoint is marked with a `b` indicating that it is an unconditional breakpoint. diff --git a/docs/src/internals.md b/docs/src/internals.md index 32a84732..3bc798b6 100644 --- a/docs/src/internals.md +++ b/docs/src/internals.md @@ -146,20 +146,22 @@ Sometimes you might have a whole sequence of expressions you want to run. In such cases, your first thought should be to construct the `Frame` manually. Here's a demonstration: -```jldoctest; setup=(using JuliaInterpreter; JuliaInterpreter.clear_caches()) +```@setup internals +using JuliaInterpreter; +JuliaInterpreter.clear_caches() +``` + +```@repl internals using Test ex = quote x, y = 1, 2 @test x + y == 3 -end +end; -frame = Frame(Main, ex) -JuliaInterpreter.finish_and_return!(frame) - -# output +frame = Frame(Main, ex); -Test Passed +JuliaInterpreter.finish_and_return!(frame) ``` ## Toplevel code and world age diff --git a/src/construct.jl b/src/construct.jl index 8bb93470..2c751a8b 100644 --- a/src/construct.jl +++ b/src/construct.jl @@ -116,11 +116,9 @@ keyword-sorter function for `fcall`. # Example ```jldoctest -julia> mymethod(x) = 1 -mymethod (generic function with 1 method) +julia> mymethod(x) = 1; -julia> mymethod(x, y; verbose=false) = nothing -mymethod (generic function with 2 methods) +julia> mymethod(x, y; verbose=false) = nothing; julia> JuliaInterpreter.prepare_args(mymethod, [mymethod, 15], ()) (mymethod, Any[mymethod, 15]) @@ -215,8 +213,7 @@ this will be the types of `allargs`); # Example ```jldoctest -julia> mymethod(x::Vector{T}) where T = 1 -mymethod (generic function with 1 method) +julia> mymethod(x::Vector{T}) where T = 1; julia> framecode, frameargs, lenv, argtypes = JuliaInterpreter.prepare_call(mymethod, [mymethod, [1.0,2.0]]); @@ -588,8 +585,7 @@ would be created by the generator. # Example ```jldoctest -julia> mymethod(x) = x+1 -mymethod (generic function with 1 method) +julia> mymethod(x) = x+1; julia> JuliaInterpreter.enter_call_expr(:(\$mymethod(1))) Frame for mymethod(x) @ Main none:1 @@ -597,8 +593,7 @@ Frame for mymethod(x) @ Main none:1 2 1 └── return %1 x = 1 -julia> mymethod(x::Vector{T}) where T = 1 -mymethod (generic function with 2 methods) +julia> mymethod(x::Vector{T}) where T = 1; julia> a = [1.0, 2.0] 2-element Vector{Float64}: @@ -631,8 +626,7 @@ Build a `Frame` ready to execute `f` with the specified positional and keyword a # Example ```jldoctest -julia> mymethod(x) = x+1 -mymethod (generic function with 1 method) +julia> mymethod(x) = x+1; julia> JuliaInterpreter.enter_call(mymethod, 1) Frame for mymethod(x) @ Main none:1 @@ -640,8 +634,7 @@ Frame for mymethod(x) @ Main none:1 2 1 └── return %1 x = 1 -julia> mymethod(x::Vector{T}) where T = 1 -mymethod (generic function with 2 methods) +julia> mymethod(x::Vector{T}) where T = 1; julia> JuliaInterpreter.enter_call(mymethod, [1.0, 2.0]) Frame for mymethod(x::Vector{T}) where T @ Main none:1 @@ -729,10 +722,7 @@ Evaluate `f` on the specified arguments using the interpreter. # Example ```jldoctest -julia> a = [1, 7] -2-element Vector{Int64}: - 1 - 7 +julia> a = [1, 7]; julia> sum(a) 8