Essentials
Introduction
Julia Baseには、科学的および数値的計算を行うためのさまざまな関数とマクロが含まれていますが、一般的なプログラミング言語の多くと同様に幅広いものでもあります。追加の機能は、成長中のコレクションから利用可能ですavailable packages。関数は、以下のトピックごとにグループ化されています。
一般的なメモ:
- モジュールの関数を使用するには、
import Moduleを使ってモジュールをインポートし、Module.fn(x)を使って関数を利用します。 - 代わりに、
using ModuleはすべてのエクスポートされたModule関数を現在の名前空間にインポートします。 - 慣例として、感嘆符(
!)で終わる関数名はその引数を変更します。一部の関数には、変更を行うバージョン(例:sort!)と変更を行わないバージョン(sort)の両方があります。
Baseおよび標準ライブラリの動作は、SemVerに定義されているように、文書化されている場合に限り安定しています。つまり、Julia documentationに含まれ、非安定としてマークされていない必要があります。詳細については、API FAQを参照してください。
Getting Around
Base.exit — Functionexit(code=0)プログラムを終了コードで停止します。デフォルトの終了コードはゼロで、プログラムが正常に完了したことを示します。インタラクティブセッションでは、exit()をキーボードショートカット^Dで呼び出すことができます。
Base.atexit — Functionatexit(f)プロセス終了時に呼び出されるゼロまたは一引数の関数 f() を登録します。atexit() フックは、後入れ先出し (LIFO) の順序で呼び出され、オブジェクトのファイナライザの前に実行されます。
f に一つの整数引数のメソッドが定義されている場合、f(n::Int32) として呼び出されます。ここで n は現在の終了コードです。それ以外の場合は f() として呼び出されます。
終了フックは exit(n) を呼び出すことが許可されており、その場合、Julia は終了コード n で終了します(元の終了コードではなく)。複数の終了フックが exit(n) を呼び出す場合、Julia は exit(n) を呼び出す最後の終了フックに対応する終了コードで終了します。(終了フックは LIFO 順序で呼び出されるため、「最後に呼び出された」は「最初に登録された」と同等です。)
注意: すべての終了フックが呼び出された後は、これ以上の終了フックを登録することはできず、すべてのフックが完了した後に atexit(f) を呼び出すと例外がスローされます。この状況は、シャットダウン中にまだ同時に実行されている可能性のあるバックグラウンドタスクから終了フックを登録している場合に発生する可能性があります。
Base.isinteractive — Functionisinteractive() -> BoolJuliaがインタラクティブセッションで実行されているかどうかを判断します。
Base.summarysize — FunctionBase.summarysize(obj; exclude=Union{...}, chargeall=Union{...}) -> Int引数から到達可能なすべてのユニークなオブジェクトによって使用されるメモリの量(バイト単位)を計算します。
キーワード引数
exclude: トラバーサルから除外するオブジェクトの型を指定します。chargeall: 通常は除外されるフィールドであっても、すべてのフィールドのサイズを常に計上するオブジェクトの型を指定します。
他にも sizeof を参照してください。
例
julia> Base.summarysize(1.0)
8
julia> Base.summarysize(Ref(rand(100)))
848
julia> sizeof(Ref(rand(100)))
8Base.__precompile__ — Function__precompile__(isprecompilable::Bool)この関数を呼び出すファイルがプリコンパイル可能かどうかを指定します。デフォルトは true です。モジュールまたはファイルが安全にプリコンパイルできない場合は、Juliaがそれをプリコンパイルしようとしたときにエラーをスローするために __precompile__(false) を呼び出す必要があります。
Base.include — FunctionBase.include([mapexpr::Function,] m::Module, path::AbstractString)モジュール m のグローバルスコープで入力ソースファイルの内容を評価します。 baremodule で定義されたモジュールを除いて、すべてのモジュールは m 引数を省略した独自の include 定義を持ち、そのモジュール内でファイルを評価します。入力ファイルの最後に評価された式の結果を返します。インクルード中は、タスクローカルのインクルードパスがファイルを含むディレクトリに設定されます。ネストされた include 呼び出しは、そのパスに対して相対的に検索されます。この関数は通常、インタラクティブにソースをロードするため、または複数のソースファイルに分割されたパッケージ内のファイルを結合するために使用されます。
オプションの最初の引数 mapexpr は、評価される前にインクルードされたコードを変換するために使用できます:path 内の各解析された式 expr に対して、include 関数は実際に mapexpr(expr) を評価します。省略された場合、mapexpr は identity にデフォルト設定されます。
include — Functioninclude([mapexpr::Function,] path::AbstractString)入力ソースファイルの内容を、含まれているモジュールのグローバルスコープで評価します。すべてのModule(baremoduleで定義されたものを除く)は、ファイルをそのモジュール内で評価するためのプライベートな1引数のinclude定義を持っています。入力ファイルの最後に評価された式の結果を返します。インクルード中は、タスクローカルのインクルードパスがファイルを含むディレクトリに設定されます。ネストされたinclude呼び出しは、そのパスに対して相対的に検索します。この関数は、通常、ソースをインタラクティブにロードするため、または複数のソースファイルに分割されたパッケージ内のファイルを結合するために使用されます。引数pathはnormpathを使用して正規化され、..のような相対パスのトークンを解決し、/を適切なパスセパレーターに変換します。
オプションの最初の引数mapexprは、評価される前にインクルードされたコードを変換するために使用できます:path内の各解析された式exprに対して、include関数は実際にmapexpr(expr)を評価します。省略した場合、mapexprはidentityにデフォルト設定されます。
別のモジュールにファイルを評価するには、Base.includeを使用してください。
Base.include_string — Functioninclude_string([mapexpr::Function,] m::Module, code::AbstractString, filename::AbstractString="string")includeと同様ですが、ファイルからではなく、指定された文字列からコードを読み込みます。
オプションの最初の引数mapexprは、評価される前に含まれるコードを変換するために使用できます:code内の各解析された式exprについて、include_string関数は実際にmapexpr(expr)を評価します。省略した場合、mapexprはidentityにデフォルト設定されます。
Base.include_dependency — Functioninclude_dependency(path::AbstractString; track_content::Bool=true)モジュール内で、path(相対または絶対)の指定されたファイル、ディレクトリ、またはシンボリックリンクがプリコンパイルの依存関係であることを宣言します。つまり、track_content=trueの場合、pathの内容が変更されるとモジュールは再コンパイルが必要になります(pathがディレクトリの場合、内容はjoin(readdir(path))に等しいです)。track_content=falseの場合、pathの修正時間mtimeが変更されると再コンパイルがトリガーされます。
これは、モジュールがincludeを介して使用されていないパスに依存している場合にのみ必要です。コンパイルの外では効果がありません。
__init__ — Keyword__init____init__() 関数は、モジュールがランタイムで初めて読み込まれた 後 に即座に実行されます。これは、モジュール内の他のすべてのステートメントが実行された後に一度だけ呼び出されます。モジュールが完全にインポートされた後に呼び出されるため、サブモジュールの __init__ 関数が最初に実行されます。__init__ の典型的な使用例は、外部 C ライブラリのランタイム初期化関数を呼び出すことと、外部ライブラリによって返されるポインタを含むグローバル定数を初期化することです。詳細については、modules に関するマニュアルセクションを参照してください。
関連情報: OncePerProcess.
例
const foo_data_ptr = Ref{Ptr{Cvoid}}(0)
function __init__()
ccall((:foo_init, :libfoo), Cvoid, ())
foo_data_ptr[] = ccall((:foo_data, :libfoo), Ptr{Cvoid}, ())
nothing
endBase.OncePerProcess — TypeOncePerProcess{T}(init::Function)() -> TOncePerProcessオブジェクトを呼び出すと、関数initializerをプロセスごとに正確に1回実行することで、型Tの値が返されます。同じプロセス内のすべての同時および将来の呼び出しは、正確に同じ値を返します。これは、キャッシュやシリアル化されない他の状態を設定できるため、事前コンパイルされるコードで便利です。
例
julia> const global_state = Base.OncePerProcess{Vector{UInt32}}() do
println("Lazy global valueを作成中...完了。")
return [Libc.rand()]
end;
julia> (procstate = global_state()) |> typeof
Lazy global valueを作成中...完了。
Vector{UInt32} (alias for Array{UInt32, 1})
julia> procstate === global_state()
true
julia> procstate === fetch(@async global_state())
trueBase.OncePerTask — TypeOncePerTask{T}(init::Function)() -> TOncePerTaskオブジェクトを呼び出すと、関数initializerをTaskごとに正確に1回実行することで、型Tの値が返されます。同じTask内のすべての将来の呼び出しは、正確に同じ値を返します。
関連情報: task_local_storage.
例
julia> const task_state = Base.OncePerTask{Vector{UInt32}}() do
println("Lazy task valueを作成中...完了。")
return [Libc.rand()]
end;
julia> (taskvec = task_state()) |> typeof
Lazy task valueを作成中...完了。
Vector{UInt32} (alias for Array{UInt32, 1})
julia> taskvec === task_state()
true
julia> taskvec === fetch(@async task_state())
Lazy task valueを作成中...完了。
falseBase.OncePerThread — TypeOncePerThread{T}(init::Function)() -> TOncePerThreadオブジェクトを呼び出すと、関数initializerをスレッドごとに正確に1回実行することで、型Tの値が返されます。同じスレッド内での将来のすべての呼び出し、および同じスレッドIDを持つ同時または将来の呼び出しは、正確に同じ値を返します。このオブジェクトは、既存のスレッドのスレッドIDでインデックスを付けることもでき、そのスレッドに保存されている値を取得(またはこのスレッドで初期化)できます。不適切な使用はデータ競合やメモリ破損を引き起こす可能性があるため、ライブラリのスレッドセーフ設計内でその動作が正しい場合にのみ使用してください。
タスクが必ずしも1つのスレッドでのみ実行されるわけではないため、ここで返される値は他の値とエイリアスを持ったり、プログラムの途中で変更されたりする可能性があります。この関数は将来的に非推奨になる可能性があります。初期化子がyieldする場合、呼び出しの開始時と呼び出し後に現在のタスクを実行しているスレッドは同じではないかもしれません。
関連情報: OncePerTask.
例
julia> const thread_state = Base.OncePerThread{Vector{UInt32}}() do
println("Lazy thread valueを作成中...完了。")
return [Libc.rand()]
end;
julia> (threadvec = thread_state()) |> typeof
Lazy thread valueを作成中...完了。
Vector{UInt32} (alias for Array{UInt32, 1})
julia> threadvec === fetch(@async thread_state())
true
julia> threadvec === thread_state[Threads.threadid()]
trueBase.which — Methodwhich(f, types)与えられた types の引数に対して呼び出される f のメソッド(Method オブジェクト)を返します。
types が抽象型である場合、invoke によって呼び出されるメソッドが返されます。
関連情報: parentmodule, @which, および @edit.
Base.methods — Functionmethods(f, [types], [module])fのメソッドテーブルを返します。
typesが指定されている場合、型が一致するメソッドの配列を返します。moduleが指定されている場合、そのモジュールで定義されたメソッドの配列を返します。モジュールのリストも配列またはセットとして指定できます。
参照: which, @which および methodswith.
Base.@show — Macro@show exs...1つ以上の式とその結果をstdoutに出力し、最後の結果を返します。
例
julia> x = @show 1+2
1 + 2 = 3
3
julia> @show x^2 x/2;
x ^ 2 = 9
x / 2 = 1.5Base.MainInclude.ans — Constantans最後に計算された値を参照する変数で、インタラクティブプロンプトに自動的にインポートされます。
Base.MainInclude.err — Constanterr最後に発生したエラーを参照する変数で、インタラクティブプロンプトに自動的にインポートされます。発生したエラーは例外のスタックに収集されます。
Base.active_project — Functionactive_project()アクティブな Project.toml ファイルのパスを返します。詳細は Base.set_active_project を参照してください。
Base.set_active_project — Functionset_active_project(projfile::Union{AbstractString,Nothing})projfileにアクティブなProject.tomlファイルを設定します。詳細はBase.active_projectを参照してください。
Keywords
これはJuliaの予約語のリストです: baremodule, begin, break, catch, const, continue, do, else, elseif, end, export, false, finally, for, function, global, if, import, let, local, macro, module, quote, return, struct, true, try, using, while。これらのキーワードは変数名として使用することはできません。
次の二語のシーケンスは予約されています: abstract type, mutable struct, primitive type。ただし、次の名前の変数を作成することはできます: abstract, mutable, primitive および type。
最終的に: where はパラメトリックメソッドおよび型定義を書くための中置演算子として解析されます; in と isa は中置演算子として解析されます; public はトップレベルステートメントの開始時にキーワードとして解析されます; outer は for ループの反復仕様における変数のスコープを修正するために使用されるときにキーワードとして解析されます; そして as は import または using によってスコープに持ち込まれた識別子の名前を変更するためのキーワードとして使用されます。ただし、where、in、isa、outer および as という名前の変数の作成は許可されています。
module — Keywordmodulemodule は Module を宣言し、これは別のグローバル変数のワークスペースです。モジュール内では、他のモジュールからどの名前が見えるかを制御(インポートを通じて)し、あなたの名前のうちどれが公開されることを意図しているかを指定できます(export と public を通じて)。モジュールを使用すると、他の誰かのコードと一緒に使用される際に名前の衝突を心配することなく、トップレベルの定義を作成できます。詳細については、モジュールに関するマニュアルセクションを参照してください。
例
module Foo
import Base.show
export MyType, foo
struct MyType
x
end
bar(x) = 2x
foo(a::MyType) = bar(a.x) + 1
show(io::IO, a::MyType) = print(io, "MyType $(a.x)")
endexport — Keywordexportexport はモジュール内で使用され、Julia にどの名前をユーザーに利用可能にするかを指示します。例えば、export foo は名前 foo をモジュールを using したときに利用可能にします。詳細については、モジュールに関するマニュアルセクション を参照してください。
public — Keywordpublicpublic はモジュール内で使用され、Julia に対してモジュールのどの名前がパブリック API の一部であるかを示します。例えば、public foo は名前 foo がパブリックであることを示しますが、モジュールを using した際に利用可能にするわけではありません。
export がすでに名前がパブリックであることを示しているため、名前を public と export の両方として宣言することは不必要であり、エラーとなります。詳細については manual section about modules を参照してください。
import — Keywordimportimport Foo はモジュールまたはパッケージ Foo をロードします。インポートされた Foo モジュールからの名前にはドット構文を使ってアクセスできます(例:Foo.foo で名前 foo にアクセス)。詳細については、manual section about modules を参照してください。
using — Keywordusingusing Foo はモジュールまたはパッケージ Foo をロードし、その export された名前を直接使用できるようにします。名前はドット構文(例:Foo.foo で名前 foo にアクセス)を介しても使用できます。これは、export されているかどうかに関係ありません。詳細については、モジュールに関するマニュアルのセクション を参照してください。
as — Keywordasas は、名前の衝突を回避するためや名前を短縮するために、import または using によってスコープに持ち込まれた識別子の名前を変更するためのキーワードとして使用されます。 (import または using ステートメントの外では、as はキーワードではなく、通常の識別子として使用できます。)
import LinearAlgebra as LA は、インポートされた LinearAlgebra 標準ライブラリを LA としてスコープに持ち込みます。
import LinearAlgebra: eigen as eig, cholesky as chol は、LinearAlgebra から eigen および cholesky メソッドをそれぞれ eig と chol としてスコープに持ち込みます。
as は、個々の識別子がスコープに持ち込まれる場合にのみ using と一緒に機能します。たとえば、using LinearAlgebra: eigen as eig または using LinearAlgebra: eigen as eig, cholesky as chol は機能しますが、using LinearAlgebra as LA は無効な構文です。なぜなら、LinearAlgebra からエクスポートされた すべての 名前を LA に変更することは意味がないからです。
baremodule — Keywordbaremodulebaremoduleは、using Baseやevalおよびincludeのローカル定義を含まないモジュールを宣言します。それでもCoreはインポートします。言い換えれば、
module Mod
...
endは次のように等価です。
baremodule Mod
using Base
eval(x) = Core.eval(Mod, x)
include(p) = Base.include(Mod, p)
...
endfunction — Keywordfunction関数は function キーワードを使って定義されます:
function add(a, b)
return a + b
endまたは短縮形の表記:
add(a, b) = a + breturn キーワードの使い方は他の言語と全く同じですが、しばしば省略可能です。明示的な return 文がない関数は、関数本体の最後の式を返します。
macro — Keywordmacromacroは、生成されたコードをプログラムに挿入するためのメソッドを定義します。マクロは、引数の式のシーケンスを返される式にマッピングし、結果の式はマクロが呼び出されたポイントでプログラムに直接置き換えられます。マクロは、evalを呼び出すことなく生成されたコードを実行する方法であり、生成されたコードは単に周囲のプログラムの一部になります。マクロの引数には、式、リテラル値、およびシンボルが含まれる場合があります。マクロは可変数の引数(varargs)に対して定義できますが、キーワード引数は受け付けません。すべてのマクロは、呼び出された行番号とファイル名を含む__source__引数と、マクロが展開されるモジュールを示す__module__引数が暗黙的に渡されます。
マクロの書き方についての詳細は、Metaprogrammingのマニュアルセクションを参照してください。
例
julia> macro sayhello(name)
return :( println("Hello, ", $name, "!") )
end
@sayhello (macro with 1 method)
julia> @sayhello "Charlie"
Hello, Charlie!
julia> macro saylots(x...)
return :( println("Say: ", $(x...)) )
end
@saylots (macro with 1 method)
julia> @saylots "hey " "there " "friend"
Say: hey there friendreturn — Keywordreturnreturn x は、囲まれた関数を早期に終了させ、与えられた値 x を呼び出し元に返します。値なしの return は return nothing と同等です(nothingを参照)。
function compare(a, b)
a == b && return "equal to"
a < b ? "less than" : "greater than"
end一般に、関数本体内のどこにでも return 文を置くことができます。深くネストされたループや条件文の中でも可能ですが、do ブロックには注意が必要です。例えば:
function test1(xs)
for x in xs
iseven(x) && return 2x
end
end
function test2(xs)
map(xs) do x
iseven(x) && return 2x
x
end
end最初の例では、return は偶数に出会った時点で test1 から抜け出すため、test1([5,6,7]) は 12 を返します。
2番目の例も同じように動作すると思うかもしれませんが、実際にはそこでの return は 内側 の関数(do ブロック内)からのみ抜け出し、map に値を返します。したがって、test2([5,6,7]) は [5,12,7] を返します。
トップレベルの式(すなわち、任意の関数の外)で使用されると、return は現在のトップレベルの式全体を早期に終了させます。
do — Keyworddo無名関数を作成し、それを関数呼び出しの最初の引数として渡します。例えば:
map(1:10) do x
2x
endは map(x->2x, 1:10) と同等です。
複数の引数を次のように使用します:
map(1:10, 11:20) do x, y
x + y
endbegin — Keywordbeginbegin...end はコードのブロックを示します。
begin
println("Hello, ")
println("World!")
end通常、begin は必要ありません。なぜなら、function や let のようなキーワードは、暗黙的にコードのブロックを開始するからです。詳細は ; を参照してください。
begin は、コレクションの最初のインデックスや配列の次元の最初のインデックスを表すためにインデックス指定時にも使用できます。例えば、a[begin] は配列 a の最初の要素です。
例
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> A[begin, :]
2-element Matrix{Int64}:
1
2end — Keywordendend は、module、struct、mutable struct、begin、let、for などの式のブロックの結論を示します。
end は、インデックス指定時にコレクションの最後のインデックスや配列の次元の最後のインデックスを表すためにも使用されます。
例
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> A[end, :]
2-element Vector{Int64}:
3
4let — Keywordletlet ブロックは新しいハードスコープを作成し、オプションで新しいローカルバインディングを導入します。
他のスコープ構造と同様に、let ブロックは新しく導入されたローカル変数がアクセス可能なコードブロックを定義します。さらに、構文はカンマ区切りの代入と、let と同じ行にオプションで現れる変数名に特別な意味を持ちます。
let var1 = value1, var2, var3 = value3
code
endこの行で導入された変数は let ブロックにローカルであり、代入は順番に評価され、右辺は左辺の名前を考慮せずにスコープ内で評価されます。したがって、let x = x のように書くことは意味があります。なぜなら、2つの x 変数は異なり、左辺が外部スコープの x をローカルにシャドウイングしているからです。これは、ローカルスコープに入るたびに新しいローカル変数が新たに作成されるため、特にクロージャを介してスコープを超えて生存する変数の場合に有用なイディオムとなります。上記の例の var2 のように、代入なしの let 変数は、まだ値にバインドされていない新しいローカル変数を宣言します。
対照的に、begin ブロックは複数の式をまとめますが、スコープを導入したり、特別な代入構文を持ったりしません。
例
以下の関数では、x が map によって3回反復的に更新されます。返されるクロージャはすべてその1つの x を最終値で参照します。
julia> function test_outer_x()
x = 0
map(1:3) do _
x += 1
return ()->x
end
end
test_outer_x (generic function with 1 method)
julia> [f() for f in test_outer_x()]
3-element Vector{Int64}:
3
3
3しかし、新しい ローカル変数を導入する let ブロックを追加すると、同じ名前を使用(シャドウ)することを選んでも、3つの異なる変数がキャプチャされることになります(各反復ごとに1つ)。
julia> function test_let_x()
x = 0
map(1:3) do _
x += 1
let x = x
return ()->x
end
end
end
test_let_x (generic function with 1 method)
julia> [f() for f in test_let_x()]
3-element Vector{Int64}:
1
2
3新しいローカル変数を導入するすべてのスコープ構造は、繰り返し実行されるとこのように動作します。let の特異な特徴は、同じ名前の外部変数をシャドウイングできる新しい local を簡潔に宣言できることです。たとえば、do 関数の引数を直接使用することも、同様に3つの異なる変数をキャプチャします。
julia> function test_do_x()
map(1:3) do x
return ()->x
end
end
test_do_x (generic function with 1 method)
julia> [f() for f in test_do_x()]
3-element Vector{Int64}:
1
2
3if — Keywordif/elseif/elseif/elseif/else は条件評価を行い、ブール式の値に応じてコードの一部を評価するかどうかを決定します。以下は if/elseif/else 条件構文の構造です:
if x < y
println("x は y より小さい")
elseif x > y
println("x は y より大きい")
else
println("x は y と等しい")
end条件式 x < y が真であれば、対応するブロックが評価されます。そうでなければ、条件式 x > y が評価され、もしそれが真であれば、対応するブロックが評価されます。どちらの式も真でない場合は、else ブロックが評価されます。elseif と else ブロックはオプションであり、必要に応じて任意の数の elseif ブロックを使用できます。
他のいくつかの言語とは異なり、条件は Bool 型でなければなりません。条件が Bool に変換可能であるだけでは不十分です。
julia> if 1 end
ERROR: TypeError: non-boolean (Int64) used in boolean contextfor — Keywordforfor ループは、値のシーケンスを反復しながら、ステートメントのブロックを繰り返し評価します。
反復変数は常に新しい変数であり、たとえ同じ名前の変数が外側のスコープに存在していてもそうです。反復のために既存のローカル変数を再利用するには、outer を使用してください。
例
julia> for i in [1, 4, 0]
println(i)
end
1
4
0while — Keywordwhilewhile ループは条件式を繰り返し評価し、式が真である限りループの本体を評価し続けます。最初に while ループに到達したときに条件式が偽であれば、本体は決して評価されません。
例
julia> i = 1
1
julia> while i < 5
println(i)
global i += 1
end
1
2
3
4break — Keywordbreakループから即座に抜け出します。
例
julia> i = 0
0
julia> while true
global i += 1
i > 5 && break
println(i)
end
1
2
3
4
5continue — Keywordcontinue現在のループの反復をスキップします。
例
julia> for i = 1:6
iseven(i) && continue
println(i)
end
1
3
5try — Keywordtry/catchtry/catch 文は、throw によって投げられたエラー(例外)を捕捉し、プログラムの実行を続行できるようにします。たとえば、次のコードはファイルの書き込みを試みますが、ファイルが書き込めない場合はユーザーに警告を出し、実行を終了するのではなく続行します:
try
open("/danger", "w") do f
println(f, "Hello")
end
catch
@warn "ファイルを書き込むことができませんでした。"
endまたは、ファイルを変数に読み込むことができない場合:
lines = try
open("/danger", "r") do f
readlines(f)
end
catch
@warn "ファイルが見つかりません。"
end構文 catch e(ここで e は任意の変数)は、投げられた例外オブジェクトを catch ブロック内の指定された変数に割り当てます。
try/catch 構文の力は、深くネストされた計算を呼び出し関数のスタックのはるか上のレベルに即座に戻す能力にあります。
try/catch ブロックには、例外が発生しなかった場合にのみ実行される else 節を持つこともできます:
try
a_dangerous_operation()
catch
@warn "操作が失敗しました。"
else
@info "操作が成功しました。"
endtry または try/catch ブロックには、例外が発生したかどうかに関係なく、最後に実行される finally 節を持つこともできます。たとえば、開いたファイルが閉じられることを保証するために使用できます:
f = open("file")
try
operate_on_file(f)
catch
@warn "エラーが発生しました!"
finally
close(f)
end(finally は catch ブロックなしでも使用できます。)
finally — Keywordfinally指定された try コードブロックがどのように終了しても、いくつかのコードを実行します。たとえば、開いたファイルが閉じられることを保証する方法は次のとおりです。
f = open("file")
try
operate_on_file(f)
finally
close(f)
end制御が try ブロックを離れるとき(たとえば、return による場合や、単に通常に終了する場合)、close(f) が実行されます。try ブロックが例外によって終了した場合、例外は引き続き伝播します。catch ブロックは try と finally と組み合わせることもできます。この場合、finally ブロックは catch がエラーを処理した後に実行されます。
quote — Keywordquotequote は、明示的な Expr コンストラクタを使用せずに、ブロック内で複数の式オブジェクトを作成します。例えば:
ex = quote
x = 1
y = 2
x + y
end他の引用手段である :( ... ) とは異なり、この形式は式ツリーに QuoteNode 要素を導入します。これはツリーを直接操作する際に考慮する必要があります。他の目的のために、:( ... ) と quote .. end ブロックは同様に扱われます。
local — Keywordlocallocal は新しいローカル変数を導入します。詳細については、manual section on variable scopingを参照してください。
例
julia> function foo(n)
x = 0
for i = 1:n
local x # ループローカルの x を導入
x = i
end
x
end
foo (generic function with 1 method)
julia> foo(10)
0global — Keywordglobalglobal x は、現在のスコープおよびその内部スコープで x がその名前のグローバル変数を参照するようにします。詳細については、manual section on variable scoping を参照してください。
例
julia> z = 3
3
julia> function foo()
global z = 6 # fooの外で定義されたz変数を使用
end
foo (generic function with 1 method)
julia> foo()
6
julia> z
6outer — Keywordfor outerfor ループで反復のために既存のローカル変数を再利用します。
詳細については、変数のスコープに関するマニュアルのセクションを参照してください。
他にも for を参照してください。
例
julia> function f()
i = 0
for i = 1:3
# empty
end
return i
end;
julia> f()
0julia> function f()
i = 0
for outer i = 1:3
# empty
end
return i
end;
julia> f()
3julia> i = 0 # グローバル変数
for outer i = 1:3
end
ERROR: syntax: no outer local variable declaration exists for "for outer"
[...]const — Keywordconstconst は、値が変わらないグローバル変数を宣言するために使用されます。ほとんどすべてのコード(特にパフォーマンスに敏感なコード)では、グローバル変数はこの方法で定数として宣言されるべきです。
const x = 5複数の変数を単一の const で宣言することができます:
const y, z = 7, 11const は一つの = 操作にのみ適用されるため、const x = y = 1 は x を定数として宣言しますが、y はそうではありません。一方、const x = const y = 1 は x と y の両方を定数として宣言します。
「定数性」は可変コンテナには及ばないことに注意してください。変数とその値との関連付けのみが定数です。例えば、x が配列や辞書である場合、要素を変更、追加、または削除することはできます。
場合によっては、const 変数の値を変更するとエラーではなく警告が表示されます。しかし、これは予測不可能な動作を引き起こしたり、プログラムの状態を破損させたりする可能性があるため、避けるべきです。この機能は、インタラクティブな使用中の便宜のためだけに意図されています。
struct — KeywordstructJuliaで最も一般的に使用される型は、名前とフィールドのセットで指定されるstructです。
struct Point
x
y
endフィールドには型制限を設けることができ、パラメータ化することも可能です:
struct Point{X}
x::X
y::Float64
endstructは、<:構文を使用して抽象スーパタイプを宣言することもできます:
struct Point <: AbstractPoint
x
y
endstructはデフォルトで不変です。これらの型のインスタンスは、構築後に変更することはできません。インスタンスを変更可能な型を宣言するには、代わりにmutable structを使用してください。
コンストラクタの定義方法など、詳細についてはComposite Typesのマニュアルセクションを参照してください。
mutable struct — Keywordmutable structmutable structはstructに似ていますが、構築後に型のフィールドを設定することも可能です。
ミュータブル構造体の個々のフィールドは、constとしてマークすることで不変にすることができます:
mutable struct Baz
a::Int
const b::Float64
end詳細については、Composite Typesのマニュアルセクションを参照してください。
Base.@kwdef — Macro@kwdef typedefこれは、typedefの式で宣言された型のためにキーワードベースのコンストラクタを自動的に定義するヘルパーマクロです。typedefはstructまたはmutable structの式でなければなりません。デフォルト引数は、field::T = defaultまたはfield = defaultの形式でフィールドを宣言することによって提供されます。デフォルトが提供されない場合、キーワード引数は結果の型コンストラクタにおいて必須のキーワード引数となります。
内部コンストラクタはまだ定義できますが、少なくとも1つはデフォルトの内部コンストラクタと同じ形式(すなわち、各フィールドに対して1つの位置引数)で引数を受け入れる必要があります。そうしないと、キーワード外部コンストラクタと正しく機能しません。
例
julia> @kwdef struct Foo
a::Int = 1 # 指定されたデフォルト
b::String # 必須のキーワード
end
Foo
julia> Foo(b="hi")
Foo(1, "hi")
julia> Foo()
ERROR: UndefKeywordError: keyword argument `b` not assigned
Stacktrace:
[...]abstract type — Keywordabstract typeabstract type はインスタンス化できない型を宣言し、型グラフのノードとしてのみ機能し、関連する具体的な型の集合を記述します:それらの具体的な型はその子孫です。抽象型は、Juliaの型システムを単なるオブジェクト実装のコレクション以上のものにする概念的な階層を形成します。例えば:
abstract type Number end
abstract type Real <: Number endprimitive type — Keywordprimitive typeprimitive typeは、データがビットの系列のみで構成される具体的な型を宣言します。プリミティブ型の古典的な例には、整数や浮動小数点値があります。いくつかの組み込みプリミティブ型の宣言の例:
primitive type Char 32 end
primitive type Bool <: Integer 8 end名前の後の数は、その型が必要とするストレージのビット数を示します。現在、サポートされているのは8ビットの倍数のサイズのみです。Boolの宣言は、プリミティブ型が任意にあるスーパタイプのサブタイプとして宣言できる方法を示しています。
where — Keywordwherewhere キーワードは UnionAll 型を作成します。これは、ある変数のすべての値に対する他の型の反復的な和として考えることができます。例えば、Vector{T} where T<:Real は、要素型が何らかの Real 数であるすべての Vector を含みます。
変数の境界は省略された場合、デフォルトで Any になります:
Vector{T} where T # `where T<:Any` の短縮形変数には下限も設定できます:
Vector{T} where T>:Int
Vector{T} where Int<:T<:Realネストされた where 式のための簡潔な構文もあります。例えば、これ:
Pair{T, S} where S<:Array{T} where T<:Numberは次のように短縮できます:
Pair{T, S} where {T<:Number, S<:Array{T}}この形式は、メソッドシグネチャでよく見られます。
この形式では、変数は外側から内側の順にリストされます。これは、型が T{p1, p2, ...} 構文を使用してパラメータ値に「適用」されるときに、変数が置き換えられる順序と一致します。
... — Keyword...「スプラット」演算子 ... は、引数のシーケンスを表します。... は関数定義で使用でき、関数が任意の数の引数を受け入れることを示します。... はまた、引数のシーケンスに関数を適用するためにも使用できます。
例
julia> add(xs...) = reduce(+, xs)
add (generic function with 1 method)
julia> add(1, 2, 3, 4, 5)
15
julia> add([1, 2, 3]...)
6
julia> add(7, 1:100..., 1000:1100...)
111107; — Keyword;セミコロンはステートメントの区切りとして使用され、関数の宣言や呼び出しにおけるキーワード引数の始まりを示します。
= — Keyword== は代入演算子です。
- 変数
aと式bに対して、a = bはaがbの値を参照するようにします。 - 関数
f(x)に対して、f(x) = xは新しい関数定数fを定義するか、fがすでに定義されている場合はfに新しいメソッドを追加します。この使い方はfunction f(x); x; endと同等です。 a[i] = vはsetindex!(a,v,i)を呼び出します。a.b = cはsetproperty!(a,:b,c)を呼び出します。- 関数呼び出しの中で、
f(a=b)はbをキーワード引数aの値として渡します。 - カンマ付きの括弧の中で、
(a=1,)はNamedTupleを構築します。
例
a を b に代入しても b のコピーは作成されません。代わりに copy または deepcopy を使用してください。
julia> b = [1]; a = b; b[1] = 2; a
1-element Vector{Int64}:
2
julia> b = [1]; a = copy(b); b[1] = 2; a
1-element Vector{Int64}:
1
関数に渡されたコレクションもコピーされません。関数は引数が参照するオブジェクトの内容を変更(変異)することができます。(このような関数の名前は慣例的に '!' で終わります。)
julia> function f!(x); x[:] .+= 1; end
f! (generic function with 1 method)
julia> a = [1]; f!(a); a
1-element Vector{Int64}:
2
代入は複数の変数に並行して操作でき、イテラブルから値を取得します:
julia> a, b = 4, 5
(4, 5)
julia> a, b = 1:3
1:3
julia> a, b
(1, 2)
代入は複数の変数に直列で操作でき、右端の式の値を返します:
julia> a = [1]; b = [2]; c = [3]; a = b = c
1-element Vector{Int64}:
3
julia> b[1] = 2; a, b, c
([2], [2], [2])
範囲外のインデックスでの代入はコレクションを成長させません。コレクションが Vector の場合、push! または append! を使用して成長させることができます。
julia> a = [1, 1]; a[3] = 2
ERROR: BoundsError: attempt to access 2-element Vector{Int64} at index [3]
[...]
julia> push!(a, 2, 3)
4-element Vector{Int64}:
1
1
2
3
[] を代入してもコレクションから要素は削除されません。代わりに filter! を使用してください。
julia> a = collect(1:3); a[a .<= 1] = []
ERROR: DimensionMismatch: tried to assign 0 elements to 1 destinations
[...]
julia> filter!(x -> x > 1, a) # in-place & thus more efficient than a = a[a .> 1]
2-element Vector{Int64}:
2
3
?: — Keyworda ? b : c条件の短縮形; 「a の場合は b を評価し、そうでなければ c を評価する」と読みます。また、三項演算子としても知られています。
この構文は if a; b else c end と同等ですが、b または c の値がより大きな式の一部として使用されることを強調するためにしばしば使用されます。b または c を評価することによる副作用よりも。
詳細については、制御フローに関するマニュアルのセクションを参照してください。
例
julia> x = 1; y = 2;
julia> x > y ? println("x is larger") : println("x is not larger")
x is not larger
julia> x > y ? "x is larger" : x == y ? "x and y are equal" : "y is larger"
"y is larger".= — Keyword.=ブロードキャストされた代入を実行します。右側の引数はbroadcastのように展開され、その後左側の引数にインプレースで代入されます。同じ式内の他のドット演算子と融合します。つまり、全体の代入式は単一のループに変換されます。
A .= Bはbroadcast!(identity, A, B)に似ています。
例
julia> A = zeros(4, 4); B = [1, 2, 3, 4];
julia> A .= B
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
2.0 2.0 2.0 2.0
3.0 3.0 3.0 3.0
4.0 4.0 4.0 4.0
julia> A
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
2.0 2.0 2.0 2.0
3.0 3.0 3.0 3.0
4.0 4.0 4.0 4.0. — Keyword.ドット演算子は、オブジェクトのフィールドやプロパティにアクセスしたり、モジュール内で定義された変数にアクセスするために使用されます。
一般に、a.b は getproperty(a, :b) を呼び出します(getpropertyを参照)。
例
julia> z = 1 + 2im; z.im
2
julia> Iterators.product
product (generic function with 1 method)-> — Keywordx -> y引数 x を関数本体 y にマッピングする匿名関数を作成します。
julia> f = x -> x^2 + 2x - 1
#1 (generic function with 1 method)
julia> f(2)
7匿名関数は複数の引数に対しても定義できます。
julia> g = (x,y) -> x^2 + y^2
#2 (generic function with 1 method)
julia> g(2,3)
13詳細については、anonymous functions のマニュアルセクションを参照してください。
:: — Keyword:::: 演算子は、値が指定された型を持つことを主張するか、ローカル変数または関数の戻り値が常に指定された型を持つことを宣言します。
expression::T の場合、まず expression が評価されます。結果が型 T の場合、値は単に返されます。そうでない場合、TypeError がスローされます。
ローカルスコープでは、構文 local x::T または x::T = expression は、ローカル変数 x が常に型 T を持つことを宣言します。変数に値が割り当てられると、その値は convert を呼び出すことによって型 T に変換されます。
メソッド宣言では、構文 function f(x)::T により、メソッドによって返される任意の値が型 T に変換されます。
型宣言 に関するマニュアルのセクションを参照してください。
例
julia> (1+2)::AbstractFloat
ERROR: TypeError: typeassert: expected AbstractFloat, got a value of type Int64
julia> (1+2)::Int
3
julia> let
local x::Int
x = 2.0
x
end
2[] — Keyword[]角括弧は、インデックス付け (getindex)、インデックス付き代入 (setindex!)、配列リテラル (Base.vect)、配列の連結 (vcat、hcat、hvcat、hvncat)、および配列内包表記 (collect)に使用されます。
Standard Modules
Main — ModuleMainMainは最上位のモジュールであり、JuliaはMainを現在のモジュールとして開始します。プロンプトで定義された変数はMainに入ります、そしてvarinfoはMainの変数をリストします。
julia> @__MODULE__
MainCore — ModuleCoreCoreは、言語に「組み込み」と見なされるすべての識別子を含むモジュールです。つまり、コア言語の一部であり、ライブラリではありません。すべてのモジュールは暗黙的にusing Coreを指定します。なぜなら、それらの定義なしでは何もできないからです。
Base — ModuleBaseJuliaのベースライブラリ。Baseは基本的な機能(base/の内容)を含むモジュールです。ほとんどのケースで必要なため、すべてのモジュールは暗黙的にusing Baseを含んでいます。
Base Submodules
Base.Broadcast — ModuleBase.Broadcastブロードキャスト実装を含むモジュールです。
Base.Docs — ModuleDocsDocsモジュールは、Juliaオブジェクトのドキュメントメタデータを設定および取得するために使用できる@docマクロを提供します。
詳細については、documentationに関するマニュアルセクションを参照してください。
Base.Iterators — Moduleイテレータと作業するためのメソッド。
Base.Libc — Modulelibc、C標準ライブラリへのインターフェース。
Base.Meta — Moduleメタプログラミングのための便利な関数。
Base.StackTraces — Moduleスタックトレースを収集し操作するためのツール。主にエラーを構築するために使用されます。
Base.Sys — Moduleハードウェアおよびオペレーティングシステムに関する情報を取得するためのメソッドを提供します。
Base.Threads — Moduleマルチスレッドサポート。
Base.GC — ModuleBase.GCガーベジコレクションユーティリティを持つモジュール。
All Objects
Core.:=== — Function===(x,y) -> Bool
≡(x,y) -> Boolx と y が同一であるかどうかを判断します。これは、どのプログラムもそれらを区別できないという意味です。まず、x と y の型が比較されます。それらが同一であれば、可変オブジェクトはメモリ内のアドレスで比較され、不変オブジェクト(数値など)はビットレベルで内容が比較されます。この関数は時々「egal」と呼ばれます。常に Bool 値を返します。
例
julia> a = [1, 2]; b = [1, 2];
julia> a == b
true
julia> a === b
false
julia> a === a
trueCore.isa — Functionisa(x, type) -> Boolxが指定されたtypeであるかどうかを判断します。中置演算子としても使用できます。例えば、x isa typeのように。
例
julia> isa(1, Int)
true
julia> isa(1, Matrix)
false
julia> isa(1, Char)
false
julia> isa(1, Number)
true
julia> 1 isa Number
trueBase.isequal — Functionisequal(x)引数を x と比較する関数を作成します。これは isequal を使用し、すなわち y -> isequal(y, x) に相当する関数です。
返される関数は Base.Fix2{typeof(isequal)} 型であり、特化したメソッドを実装するために使用できます。
isequal(x, y) -> Bool==と似ていますが、浮動小数点数と欠損値の扱いが異なります。isequalはすべての浮動小数点NaN値を互いに等しいと見なし、-0.0を0.0とは異なるものとして扱い、missingをmissingとして等しいと見なします。常にBool値を返します。
isequalは同値関係であり、反射的(===はisequalを含意)、対称的(isequal(a, b)はisequal(b, a)を含意)、推移的(isequal(a, b)およびisequal(b, c)はisequal(a, c)を含意)です。
実装
isequalのデフォルト実装は==を呼び出すため、浮動小数点値を含まない型は一般的に==を定義するだけで済みます。
isequalはハッシュテーブル(Dict)で使用される比較関数です。isequal(x,y)はhash(x) == hash(y)を含意しなければなりません。
これは通常、カスタム==またはisequalメソッドが存在する型は、対応するhashメソッドを実装しなければならないことを意味します(その逆も同様です)。コレクションは通常、すべての内容に対して再帰的にisequalを呼び出すことでisequalを実装します。
さらに、isequalはislessと関連しており、これらは一緒に固定された全順序を定義します。この順序では、isequal(x, y)、isless(x, y)、またはisless(y, x)のうちの1つだけがtrueでなければならず(他の2つはfalse)、成り立ちます。
スカラー型は一般的に、浮動小数点数を表す場合を除いて、==とは別にisequalを実装する必要はありません。これは、isnan、signbit、および==に基づいて提供される一般的なフォールバックよりも効率的な実装が可能な場合です。
例
julia> isequal([1., NaN], [1., NaN])
true
julia> [1., NaN] == [1., NaN]
false
julia> 0.0 == -0.0
true
julia> isequal(0.0, -0.0)
false
julia> missing == missing
missing
julia> isequal(missing, missing)
trueBase.isless — Functionisless(x, y)xがyより小さいかどうかを、固定された全順序に従ってテストします(isequalと共に定義されています)。islessはすべての型のペア(x, y)に対して定義されているわけではありません。しかし、定義されている場合は、以下の条件を満たすことが期待されます:
isless(x, y)が定義されている場合、isless(y, x)およびisequal(x, y)も定義されており、これらの3つのうちの正確に1つがtrueを返します。islessによって定義される関係は推移的です。すなわち、isless(x, y) && isless(y, z)が成り立つ場合、isless(x, z)も成り立ちます。
通常順序付けされない値、例えばNaNは、通常の値の後に順序付けされます。missing値は最後に順序付けされます。
これはsort!によって使用されるデフォルトの比較です。
実装
全順序を持つ非数値型は、この関数を実装する必要があります。数値型は、NaNのような特別な値を持つ場合にのみ実装する必要があります。部分順序を持つ型は<を実装する必要があります。ソートや関連する関数で使用できる代替順序メソッドを定義する方法については、Alternate Orderingsのドキュメントを参照してください。
例
julia> isless(1, 3)
true
julia> isless("Red", "Blue")
falseBase.isunordered — Functionisunordered(x)xが<に従って順序付けできない値(NaNやmissingなど)である場合、trueを返します。
この述語でtrueと評価される値は、islessなどの他の順序に関しては順序付け可能である場合があります。
Base.ifelse — Functionifelse(condition::Bool, x, y)conditionがtrueの場合はxを返し、それ以外の場合はyを返します。これは?やifとは異なり、通常の関数であるため、すべての引数が最初に評価されます。場合によっては、if文の代わりにifelseを使用することで、生成されたコードの分岐を排除し、タイトなループでのパフォーマンスを向上させることができます。
例
julia> ifelse(1 > 2, 1, 2)
2Core.typeassert — Functiontypeassert(x, type)x isa type でない場合は TypeError をスローします。構文 x::type はこの関数を呼び出します。
例
julia> typeassert(2.5, Int)
ERROR: TypeError: in typeassert, expected Int64, got a value of type Float64
Stacktrace:
[...]Core.typeof — Functiontypeof(x)xの具体的な型を取得します。
関連情報としてeltypeも参照してください。
例
julia> a = 1//2;
julia> typeof(a)
Rational{Int64}
julia> M = [1 2; 3.5 4];
julia> typeof(M)
Matrix{Float64} (alias for Array{Float64, 2})Core.tuple — Functiontuple(xs...)与えられたオブジェクトのタプルを構築します。
関連項目: Tuple, ntuple, NamedTuple.
例
julia> tuple(1, 'b', pi)
(1, 'b', π)
julia> ans === (1, 'b', π)
true
julia> Tuple(Real[1, 2, pi]) # コレクションを受け取ります
(1, 2, π)Base.ntuple — Functionntuple(f, ::Val{N})長さ N のタプルを作成し、各要素を f(i) として計算します。ここで、i は要素のインデックスです。Val(N) 引数を取ることで、このバージョンの ntuple は整数として長さを取るバージョンよりも効率的なコードを生成する可能性があります。しかし、N がコンパイル時に決定できない場合は、ntuple(f, Val(N)) よりも ntuple(f, N) の方が好ましいです。
例
julia> ntuple(i -> 2*i, Val(4))
(2, 4, 6, 8)ntuple(f, n::Integer)長さ n のタプルを作成し、各要素を f(i) として計算します。ここで、i は要素のインデックスです。
例
julia> ntuple(i -> 2*i, 4)
(2, 4, 6, 8)Base.objectid — Functionobjectid(x) -> UIntオブジェクトのアイデンティティに基づいて x のハッシュ値を取得します。
もし x === y であれば objectid(x) == objectid(y) となり、通常 x !== y の場合は objectid(x) != objectid(y) となります。
Base.hash — Functionhash(x[, h::UInt]) -> UInt整数ハッシュコードを計算します。isequal(x,y) が成り立つ場合、hash(x)==hash(y) も成り立ちます。オプションの第二引数 h は、結果と混合される別のハッシュコードです。
新しい型は、通常、内容のハッシュを互いに(および h と)混合するために、2引数の hash メソッドを再帰的に呼び出すことによって、2引数形式を実装する必要があります。通常、hash を実装する任意の型は、上記の性質を保証するために独自の ==(したがって [isequal](@ref))も実装する必要があります。
ハッシュ値は、新しいJuliaプロセスが開始されると変更される可能性があります。
julia> a = hash(10)
0x95ea2955abd45275
julia> hash(10, a) # 別のハッシュ関数の出力を第二引数としてのみ使用
0xd42bad54a8575b16Base.finalizer — Functionfinalizer(f, x)プログラムからアクセス可能な参照が x に対して存在しなくなったときに呼び出される関数 f(x) を登録し、x を返します。x の型は mutable struct でなければならず、そうでない場合は関数がエラーをスローします。
f はタスクスイッチを引き起こしてはいけません。これにより、println のようなほとんどの I/O 操作が除外されます。@async マクロを使用して(ファイナライザの外でコンテキストスイッチを遅延させるため)たり、C の I/O 関数を直接呼び出すために ccall を使用することは、デバッグ目的で役立つかもしれません。
f の実行に対して保証されたワールドエイジはないことに注意してください。ファイナライザが登録されたワールドエイジまたはそれ以降のワールドエイジで呼び出される可能性があります。
例
finalizer(my_mutable_struct) do x
@async println("Finalizing $x.")
end
finalizer(my_mutable_struct) do x
ccall(:jl_safe_printf, Cvoid, (Cstring, Cstring), "Finalizing %s.", repr(x))
endファイナライザはオブジェクトの構築時に登録することができます。以下の例では、ファイナライザが新しく作成されたミュータブル構造体 x を返すことに暗黙的に依存していることに注意してください。
mutable struct MyMutableStruct
bar
function MyMutableStruct(bar)
x = new(bar)
f(t) = @async println("Finalizing $t.")
finalizer(f, x)
end
endBase.finalize — Functionfinalize(x)オブジェクト x に登録されたファイナライザを即座に実行します。
Base.copy — Functioncopy(x)xの浅いコピーを作成します:外部構造はコピーされますが、すべての内部値はコピーされません。たとえば、配列をコピーすると、元の配列と同じ要素を持つ新しい配列が生成されます。
Base.deepcopy — Functiondeepcopy(x)xのディープコピーを作成します:すべてが再帰的にコピーされ、完全に独立したオブジェクトが生成されます。たとえば、配列をディープコピーすると、その配列が含むすべてのオブジェクトのディープコピーが作成され、一貫した関係構造を持つ新しい配列が生成されます(たとえば、元の配列の最初の2つの要素が同じオブジェクトである場合、新しい配列の最初の2つの要素も同じdeepcopyされたオブジェクトになります)。オブジェクトに対してdeepcopyを呼び出すことは、一般的にシリアライズしてからデシリアライズするのと同じ効果があります。
通常は必要ありませんが、ユーザー定義型は、関数deepcopy_internal(x::T, dict::IdDict)の特別なバージョンを定義することで、デフォルトのdeepcopyの動作をオーバーライドできます(これは他の目的で使用すべきではありません)。ここで、Tは特化する型であり、dictは再帰内でこれまでにコピーされたオブジェクトを追跡します。定義内では、deepcopy_internalをdeepcopyの代わりに使用し、戻り値を返す前にdict変数を適切に更新する必要があります。
Base.getproperty — Functiongetproperty(value, name::Symbol)
getproperty(value, name::Symbol, order::Symbol)構文 a.b は getproperty(a, :b) を呼び出します。構文 @atomic order a.b は getproperty(a, :b, :order) を呼び出し、構文 @atomic a.b は getproperty(a, :b, :sequentially_consistent) を呼び出します。
例
julia> struct MyType{T <: Number}
x::T
end
julia> function Base.getproperty(obj::MyType, sym::Symbol)
if sym === :special
return obj.x + 1
else # fallback to getfield
return getfield(obj, sym)
end
end
julia> obj = MyType(1);
julia> obj.special
2
julia> obj.x
1getproperty は必要な場合にのみオーバーロードすべきです。なぜなら、構文 obj.f の動作が異常であると混乱を招く可能性があるからです。また、メソッドを使用することがしばしば好ましいことにも注意してください。詳細については、このスタイルガイドのドキュメントを参照してください: Prefer exported methods over direct field access。
また、getfield、propertynames および setproperty! も参照してください。
Base.setproperty! — Functionsetproperty!(value, name::Symbol, x)
setproperty!(value, name::Symbol, x, order::Symbol)構文 a.b = c は setproperty!(a, :b, c) を呼び出します。構文 @atomic order a.b = c は setproperty!(a, :b, c, :order) を呼び出し、構文 @atomic a.b = c は setproperty!(a, :b, c, :sequentially_consistent) を呼び出します。
他に setfield!, propertynames および getproperty を参照してください。
Base.replaceproperty! — Functionreplaceproperty!(x, f::Symbol, expected, desired, success_order::Symbol=:not_atomic, fail_order::Symbol=success_order)x.fの値をexpectedからdesiredに、egalに従って比較交換操作を行います。関数呼び出し形式の代わりに、構文@atomicreplace x.f expected => desiredを使用できます。
関連項目としては、replacefield! setproperty!, setpropertyonce!があります。
Base.swapproperty! — Functionswapproperty!(x, f::Symbol, v, order::Symbol=:not_atomic)構文 @atomic a.b, _ = c, a.b は (c, swapproperty!(a, :b, c, :sequentially_consistent)) を返します。このとき、両側に共通する getproperty 式が1つ必要です。
また、swapfield! と setproperty! も参照してください。
Base.modifyproperty! — Functionmodifyproperty!(x, f::Symbol, op, v, order::Symbol=:not_atomic)構文 @atomic op(x.f, v)(およびその同等の @atomic x.f op v)は modifyproperty!(x, :f, op, v, :sequentially_consistent) を返します。ここで、最初の引数は getproperty 式でなければならず、原子的に修正されます。
op(getproperty(x, f), v) の呼び出しは、デフォルトでオブジェクト x のフィールド f に格納できる値を返さなければなりません。特に、setproperty! のデフォルトの動作とは異なり、convert 関数は自動的には呼び出されません。
他に modifyfield! と setproperty! も参照してください。
Base.setpropertyonce! — Functionsetpropertyonce!(x, f::Symbol, value, success_order::Symbol=:not_atomic, fail_order::Symbol=success_order)x.fに対して比較とスワップの操作を行い、以前に設定されていなければvalueに設定します。関数呼び出し形式の代わりに@atomiconce x.f = valueという構文を使用できます。
関連情報としては、setfieldonce!, setproperty!, replaceproperty!があります。
Base.propertynames — Functionpropertynames(x, private=false)オブジェクト x のプロパティ(x.property)のタプルまたはベクターを取得します。これは通常、fieldnames(typeof(x)) と同じですが、getproperty をオーバーロードするタイプは、タイプのインスタンスのプロパティを取得するために propertynames もオーバーロードする必要があります。
propertynames(x) は、x の文書化されたインターフェースの一部である「公開」プロパティ名のみを返す場合があります。内部使用を目的とした「プライベート」プロパティ名も返すようにしたい場合は、オプションの第二引数に true を渡してください。x. に対する REPL のタブ補完は、private=false のプロパティのみを表示します。
関連情報: hasproperty, hasfield.
Base.hasproperty — Functionhasproperty(x, s::Symbol)オブジェクト x が s を自身のプロパティの一つとして持っているかどうかを示すブール値を返します。
関連: propertynames, hasfield.
Core.getfield — Functiongetfield(value, name::Symbol, [order::Symbol])
getfield(value, i::Int, [order::Symbol])名前または位置によって複合的な value からフィールドを抽出します。オプションで、操作のための順序を定義できます。フィールドが @atomic として宣言されている場合、その仕様はその位置へのストアと互換性があることが強く推奨されます。そうでない場合、@atomic として宣言されていない場合は、このパラメータは指定された場合 :not_atomic でなければなりません。 getproperty および fieldnames も参照してください。
例
julia> a = 1//2
1//2
julia> getfield(a, :num)
1
julia> a.num
1
julia> getfield(a, 1)
1Core.setfield! — Functionsetfield!(value, name::Symbol, x, [order::Symbol])
setfield!(value, i::Int, x, [order::Symbol])valueの名前付きフィールドにxを割り当てます。valueは可変でなければならず、xはfieldtype(typeof(value), name)のサブタイプでなければなりません。さらに、この操作のために順序を指定することができます。フィールドが@atomicとして宣言されている場合、この指定は必須です。そうでない場合、指定されている場合は:not_atomicでなければなりません。詳細はsetproperty!を参照してください。
例
julia> mutable struct MyMutableStruct
field::Int
end
julia> a = MyMutableStruct(1);
julia> setfield!(a, :field, 2);
julia> getfield(a, :field)
2
julia> a = 1//2
1//2
julia> setfield!(a, :num, 3);
ERROR: setfield!: immutable struct of type Rational cannot be changedCore.modifyfield! — Functionmodifyfield!(value, name::Symbol, op, x, [order::Symbol]) -> Pair
modifyfield!(value, i::Int, op, x, [order::Symbol]) -> Pair関数 op を適用した後にフィールドを取得および設定する操作を原子的に実行します。
y = getfield(value, name)
z = op(y, x)
setfield!(value, name, z)
return y => zハードウェアがサポートしている場合(例えば、原子的なインクリメント)、これは適切なハードウェア命令に最適化される可能性があります。そうでない場合は、ループを使用します。
Core.replacefield! — Functionreplacefield!(value, name::Symbol, expected, desired,
[success_order::Symbol, [fail_order::Symbol=success_order]) -> (; old, success::Bool)
replacefield!(value, i::Int, expected, desired,
[success_order::Symbol, [fail_order::Symbol=success_order]) -> (; old, success::Bool)与えられた値にフィールドを取得し、条件付きで設定する操作を原子的に実行します。
y = getfield(value, name, fail_order)
ok = y === expected
if ok
setfield!(value, name, desired, success_order)
end
return (; old = y, success = ok)ハードウェアがサポートしている場合、これは適切なハードウェア命令に最適化される可能性があります。そうでない場合は、ループを使用します。
Core.swapfield! — Functionswapfield!(value, name::Symbol, x, [order::Symbol])
swapfield!(value, i::Int, x, [order::Symbol])フィールドを同時に取得して設定する操作を原子的に実行します:
y = getfield(value, name)
setfield!(value, name, x)
return yCore.setfieldonce! — Functionsetfieldonce!(value, name::Union{Int,Symbol}, desired,
[success_order::Symbol, [fail_order::Symbol=success_order]) -> success::Bool以前に設定されていなかった場合に限り、フィールドを指定された値に設定する操作を原子的に実行します。
ok = !isdefined(value, name, fail_order)
if ok
setfield!(value, name, desired, success_order)
end
return okCore.isdefined — Functionisdefined(m::Module, s::Symbol, [order::Symbol])
isdefined(object, s::Symbol, [order::Symbol])
isdefined(object, index::Int, [order::Symbol])グローバル変数またはオブジェクトフィールドが定義されているかどうかをテストします。引数にはモジュールとシンボル、または複合オブジェクトとフィールド名(シンボルとして)またはインデックスを指定できます。オプションで、操作のための順序を定義することができます。フィールドが @atomic として宣言されている場合、その仕様はその位置へのストアと互換性があることが強く推奨されます。そうでない場合、@atomic として宣言されていない場合、このパラメータは指定されている場合 :not_atomic でなければなりません。
配列要素が定義されているかどうかをテストするには、isassigned を使用してください。
グローバル変数のバリアントは、古い Julia リリースとの互換性のためにサポートされています。新しいコードでは、isdefinedglobal を使用することをお勧めします。
他にも @isdefined を参照してください。
例
julia> isdefined(Base, :sum)
true
julia> isdefined(Base, :NonExistentMethod)
false
julia> a = 1//2;
julia> isdefined(a, 2)
true
julia> isdefined(a, 3)
false
julia> isdefined(a, :num)
true
julia> isdefined(a, :numerator)
falseCore.isdefinedglobal — Functionisdefinedglobal(m::Module, s::Symbol, [allow_import::Bool=true, [order::Symbol=:unordered]])モジュール m においてグローバル変数 s が定義されているかどうかをテストします(現在のワールドエイジにおいて)。変数は、グローバル変数から値を読み取ることができ、アクセスが例外をスローしない場合にのみ定義されていると見なされます。これには、定数と値が設定されているグローバル変数の両方が含まれます。
allow_import が false の場合、グローバル変数は m 内で定義されている必要があり、他のモジュールからインポートされてはなりません。
関連情報として @isdefined を参照してください。
例
julia> isdefinedglobal(Base, :sum)
true
julia> isdefinedglobal(Base, :NonExistentMethod)
false
julia> isdefinedglobal(Base, :sum, false)
true
julia> isdefinedglobal(Main, :sum, false)
falseBase.@isdefined — Macro@isdefined s -> Bool変数 s が現在のスコープで定義されているかどうかをテストします。
フィールドプロパティについては isdefined を、配列インデックスについては isassigned を、その他のマッピングについては haskey を参照してください。
例
julia> @isdefined newvar
false
julia> newvar = 1
1
julia> @isdefined newvar
true
julia> function f()
println(@isdefined x)
x = 3
println(@isdefined x)
end
f (generic function with 1 method)
julia> f()
false
trueBase.convert — Functionconvert(T, x)xを型Tの値に変換します。
TがInteger型の場合、xがTで表現できない場合(例えば、xが整数値でない場合や、Tがサポートする範囲外の場合)には、InexactErrorが発生します。
例
julia> convert(Int, 3.0)
3
julia> convert(Int, 3.5)
ERROR: InexactError: Int64(3.5)
Stacktrace:
[...]TがAbstractFloat型の場合、Tで表現可能なxに最も近い値が返されます。Infは、最も近い値を決定する目的でfloatmax(T)よりも1 ulp大きいものとして扱われます。
julia> x = 1/3
0.3333333333333333
julia> convert(Float32, x)
0.33333334f0
julia> convert(BigFloat, x)
0.333333333333333314829616256247390992939472198486328125Tがコレクション型で、xがコレクションの場合、convert(T, x)の結果はxのすべてまたは一部をエイリアスすることがあります。
julia> x = Int[1, 2, 3];
julia> y = convert(Vector{Int}, x);
julia> y === x
true他にも: round, trunc, oftype, reinterpretをご覧ください。
Base.promote — Functionpromote(xs...)すべての引数を共通の型に変換し、それらをすべて(タプルとして)返します。引数を変換できない場合は、エラーが発生します。
参照: promote_type, promote_rule.
例
julia> promote(Int8(1), Float16(4.5), Float32(4.1))
(1.0f0, 4.5f0, 4.1f0)
julia> promote_type(Int8, Float16, Float32)
Float32
julia> reduce(Base.promote_typejoin, (Int8, Float16, Float32))
Real
julia> promote(1, "x")
ERROR: promotion of types Int64 and String failed to change any arguments
[...]
julia> promote_type(Int, String)
AnyBase.oftype — Functionoftype(x, y)yをxの型に変換します。すなわち、convert(typeof(x), y)です。
例
julia> x = 4;
julia> y = 3.;
julia> oftype(x, y)
3
julia> oftype(y, x)
4.0Base.widen — Functionwiden(x)x が型である場合、算術演算 + および - がオーバーフローせず、型 x が保持できる値の任意の組み合わせに対して精度を失わないように定義された「大きな」型を返します。
128ビット未満の固定サイズ整数型の場合、widen はビット数が2倍の型を返します。
x が値である場合、widen(typeof(x)) に変換されます。
例
julia> widen(Int32)
Int64
julia> widen(1.5f0)
1.5Base.identity — Functionidentity(x)恒等関数。引数を返します。
関連項目: one, oneunit, および LinearAlgebra の I。
例
julia> identity("Well, what did you expect?")
"Well, what did you expect?"Core.WeakRef — TypeWeakRef(x)w = WeakRef(x) は、Juliaの値 x への 弱参照 を構築します:w は x への参照を含んでいますが、x がガーベジコレクトされるのを防ぎません。w.value は、x がまだガーベジコレクトされていない場合は x であり、x がガーベジコレクトされている場合は nothing です。
julia> x = "a string"
"a string"
julia> w = WeakRef(x)
WeakRef("a string")
julia> GC.gc()
julia> w # a reference is maintained via `x`
WeakRef("a string")
julia> x = nothing # clear reference
julia> GC.gc()
julia> w
WeakRef(nothing)Properties of Types
Type relations
Base.supertype — Functionsupertype(T::Union{DataType, UnionAll})型 T の直接のスーパタイプを返します。T は DataType または UnionAll 型であることができます。型 Union はサポートされていません。さらに、Types に関する情報も参照してください。
例
julia> supertype(Int32)
Signed
julia> supertype(Vector)
DenseVector (alias for DenseArray{T, 1} where T)Core.Type — TypeCore.Type{T}Core.Type は、すべての型オブジェクトをそのインスタンスとして持つ抽象型です。シングルトン型 Core.Type{T} の唯一のインスタンスはオブジェクト T です。
例
julia> isa(Type{Float64}, Type)
true
julia> isa(Float64, Type)
true
julia> isa(Real, Type{Float64})
false
julia> isa(Real, Type{Real})
trueCore.DataType — TypeDataType <: Type{T}DataTypeは、名前が付けられた明示的に宣言された型、明示的に宣言されたスーパタイプ、およびオプションでパラメータを持つ型を表します。システム内のすべての具体的な値は、いずれかのDataTypeのインスタンスです。
例
julia> typeof(Real)
DataType
julia> typeof(Int)
DataType
julia> struct Point
x::Int
y
end
julia> typeof(Point)
DataTypeCore.:<: — Function<:(T1, T2)::Boolサブタイピング関係は、2つの型の間で定義されます。Juliaにおいて、型 S は型 T の サブタイプ であると言われるのは、S <: T が成り立つ場合のみです。
任意の型 L と任意の型 R に対して、L <: R は、型 L の任意の値 v が型 R の値でもあることを意味します。すなわち、(L <: R) && (v isa L) は v isa R を意味します。
サブタイピング関係は 部分順序 です。すなわち、<: は以下の性質を持ちます:
- 反射的:任意の型
Tに対して、T <: Tが成り立ちます - 反対称的:任意の型
Aと任意の型Bに対して、(A <: B) && (B <: A)はA == Bを意味します - 推移的:任意の型
A、任意の型B、および任意の型Cに対して、(A <: B) && (B <: C)はA <: Cを意味します
詳細は Types、Union{}、Any、isa の情報を参照してください。
例
julia> Float64 <: AbstractFloat
true
julia> Vector{Int} <: AbstractArray
true
julia> Matrix{Float64} <: Matrix{AbstractFloat} # `Matrix` は不変
false
julia> Tuple{Float64} <: Tuple{AbstractFloat} # `Tuple` は共変
true
julia> Union{} <: Int # 最下位型 `Union{}` は各型のサブタイプです。
true
julia> Union{} <: Float32 <: AbstractFloat <: Real <: Number <: Any # 演算子のチェーン
true<: キーワードは、同じサブタイピング関係を表すいくつかの構文上の使い方も持っていますが、演算子を実行したり Bool を返したりはしません:
UnionAll型のパラメータの下限と上限をwhere文で指定するため。- メソッドの (静的) パラメータの下限と上限を指定するため、Parametric Methods を参照してください。
- 新しい型を宣言する際にサブタイピング関係を定義するため、
structとabstract typeを参照してください。
Core.:>: — Function>:(T1, T2)スーパタイプ演算子で、T2 <: T1 と同等です。
Base.typejoin — Functiontypejoin(T, S, ...)型 T と S の最も近い共通の祖先を返します。つまり、両方が継承する最も狭い型です。追加の varargs に対して再帰します。
例
julia> typejoin(Int, Float64)
Real
julia> typejoin(Int, Float64, ComplexF32)
NumberBase.typeintersect — Functiontypeintersect(T::Type, S::Type)T と S の交差を含む型を計算します。通常、これはそのような型の中で最も小さいもの、またはそれに近いものになります。
正確な動作が保証される特別なケース: T <: S の場合、typeintersect(S, T) == T == typeintersect(T, S) です。
Base.promote_type — Functionpromote_type(type1, type2, ...)プロモーションは、異なる型の値を単一の共通型に変換することを指します。promote_typeは、演算子(通常は数学的なもの)が異なる型の引数を受け取ったときのJuliaにおけるデフォルトのプロモーション動作を表します。promote_typeは、一般的に、過度に広がることなく、いずれかの入力型のほとんどの値を少なくとも近似できる型を返そうとします。いくらかの損失は許容されます。たとえば、promote_type(Int64, Float64)はFloat64を返しますが、厳密にはすべてのInt64の値が正確にFloat64の値として表現できるわけではありません。
関連情報: promote, promote_typejoin, promote_rule.
例
julia> promote_type(Int64, Float64)
Float64
julia> promote_type(Int32, Int64)
Int64
julia> promote_type(Float32, BigInt)
BigFloat
julia> promote_type(Int16, Float16)
Float16
julia> promote_type(Int64, Float16)
Float16
julia> promote_type(Int8, UInt16)
UInt16自分の型のためにプロモーションをオーバーロードするには、promote_ruleをオーバーロードする必要があります。promote_typeは、型を決定するために内部的にpromote_ruleを呼び出します。promote_typeを直接オーバーロードすると、曖昧さのエラーが発生する可能性があります。
Base.promote_rule — Functionpromote_rule(type1, type2)type1 と type2 の型の値が与えられたときに promote が使用すべき型を指定します。この関数は直接呼び出すべきではなく、新しい型に対して適切に定義を追加する必要があります。
Base.promote_typejoin — Functionpromote_typejoin(T, S)T と S の両方を含む型を計算します。これは、両方の型の親であるか、適切であれば Union である可能性があります。 typejoin にフォールバックします。
代わりに promote、promote_type を参照してください。
例
julia> Base.promote_typejoin(Int, Float64)
Real
julia> Base.promote_type(Int, Float64)
Float64Base.isdispatchtuple — Functionisdispatchtuple(T)型 T が具体的な型のタプルであるかどうかを判断します。つまり、ディスパッチの型シグネチャに現れる可能性があり、呼び出しに現れる可能性のあるサブタイプ(またはスーパタイプ)がないことを意味します。もし T が型でない場合は、false を返します。
Declared structure
Base.ismutable — Functionismutable(v) -> Bool値 v が可変である場合にのみ true を返します。 不変性についての議論は Mutable Composite Types を参照してください。この関数は値に対して動作するため、DataType を与えると、その型の値が可変であると教えてくれます。
他にも isbits、isstructtype を参照してください。
例
julia> ismutable(1)
false
julia> ismutable([1,2])
trueBase.isimmutable — Functionisimmutable(v) -> Boolisimmutable(v) は将来のリリースで !ismutable(v) に置き換えられるため、代わりに !ismutable(v) を使用することを検討してください。 (Julia 1.5以降)
値 v が不変である場合にのみ true を返します。 不変性についての議論は Mutable Composite Types を参照してください。この関数は値に対して動作するため、型を与えると DataType の値が可変であると返します。
例
julia> isimmutable(1)
true
julia> isimmutable([1,2])
falseBase.ismutabletype — Functionismutabletype(T) -> Bool型 T が可変型として宣言されたかどうかを判断します(すなわち、mutable struct キーワードを使用して)。もし T が型でない場合は、false を返します。
Base.isabstracttype — Functionisabstracttype(T)型 T が抽象型として宣言されたかどうかを判断します(つまり、abstract type 構文を使用して)。これは isconcretetype(T) の否定ではないことに注意してください。もし T が型でない場合は、false を返します。
例
julia> isabstracttype(AbstractArray)
true
julia> isabstracttype(Vector)
falseBase.isprimitivetype — Functionisprimitivetype(T) -> Bool型 T がプリミティブ型として宣言されたかどうかを判断します(すなわち、primitive type 構文を使用して)。もし T が型でない場合は、false を返します。
Base.issingletontype — FunctionBase.issingletontype(T)型 T が正確に1つのインスタンスを持つかどうかを判断します。たとえば、他のシングルトン値を除いてフィールドを持たない構造体型です。T が具体的な型でない場合は、false を返します。
Base.isstructtype — Functionisstructtype(T) -> Bool型 T が構造体型として宣言されたかどうかを判断します(すなわち、struct または mutable struct キーワードを使用して)。もし T が型でない場合は、false を返します。
Base.nameof — Methodnameof(t::DataType) -> SymbolDataType(親モジュールなし)の名前をシンボルとして取得します(潜在的に UnionAll でラップされている場合)。
例
julia> module Foo
struct S{T}
end
end
Foo
julia> nameof(Foo.S{T} where T)
:SBase.fieldnames — Functionfieldnames(x::DataType)DataTypeのフィールドの名前を持つタプルを取得します。
各名前はSymbolですが、x <: Tupleの場合は、各名前(実際にはフィールドのインデックス)はIntです。
propertynamesやhasfieldも参照してください。
例
julia> fieldnames(Rational)
(:num, :den)
julia> fieldnames(typeof(1+im))
(:re, :im)
julia> fieldnames(Tuple{String,Int})
(1, 2)Base.fieldname — Functionfieldname(x::DataType, i::Integer)DataTypeのフィールドiの名前を取得します。
戻り値の型はSymbolですが、x <: Tupleの場合はフィールドのインデックスが返され、その型はIntです。
例
julia> fieldname(Rational, 1)
:num
julia> fieldname(Rational, 2)
:den
julia> fieldname(Tuple{String,Int}, 2)
2Core.fieldtype — Functionfieldtype(T, name::Symbol | index::Int)複合データ型 T におけるフィールド(名前またはインデックスで指定)の宣言された型を決定します。
例
julia> struct Foo
x::Int64
y::String
end
julia> fieldtype(Foo, :x)
Int64
julia> fieldtype(Foo, 2)
StringBase.fieldtypes — Functionfieldtypes(T::Type)複合データ型 T のすべてのフィールドの宣言された型をタプルとして返します。
例
julia> struct Foo
x::Int64
y::String
end
julia> fieldtypes(Foo)
(Int64, String)Base.fieldcount — Functionfieldcount(t::Type)指定された型のインスタンスが持つフィールドの数を取得します。この型があまりにも抽象的であるためにこれを決定できない場合、エラーが発生します。
Base.hasfield — Functionhasfield(T::Type, name::Symbol)Tがnameを自身のフィールドの1つとして持っているかどうかを示すブール値を返します。
関連情報としてはfieldnames、fieldcount、haspropertyがあります。
例
julia> struct Foo
bar::Int
end
julia> hasfield(Foo, :bar)
true
julia> hasfield(Foo, :x)
falseCore.nfields — Functionnfields(x) -> Int与えられたオブジェクトのフィールドの数を取得します。
例
julia> a = 1//2;
julia> nfields(a)
2
julia> b = 1
1
julia> nfields(b)
0
julia> ex = ErrorException("I've done a bad thing");
julia> nfields(ex)
1これらの例では、a は Rational で、2つのフィールドを持っています。b は Int で、フィールドを全く持たないプリミティブビットタイプです。ex は ErrorException で、1つのフィールドを持っています。
Base.isconst — Functionisconst(t::DataType, s::Union{Int,Symbol}) -> Bool与えられた型 t において、フィールド s が const であるかどうかを判断します。これは、該当フィールドからの読み取りが等しいオブジェクトに対して一貫していることを意味します。特に、範囲外のフィールドはこの定義の下で const と見なされることに注意してください(常に例外をスローするため)。
isconst(m::Module, s::Symbol) -> Bool
isconst(g::GlobalRef)指定されたモジュール m において、グローバルが const であるかどうかを判断します。これは、定数として宣言されたか、または定数バインディングからインポートされたためです。定数性は特定のワールドエイジに特有であるため、この関数の結果はワールドエイジの更新後に保持されるとは限りません。
Base.isfieldatomic — Functionisfieldatomic(t::DataType, s::Union{Int,Symbol}) -> Bool指定された型 t において、フィールド s が @atomic として宣言されているかどうかを判断します。
Memory layout
Base.sizeof — Methodsizeof(T::DataType)
sizeof(obj)与えられた DataType T の標準的なバイナリ表現のサイズ(バイト単位)。または、obj が DataType でない場合のオブジェクト obj のサイズ(バイト単位)。
関連情報は Base.summarysize を参照してください。
例
julia> sizeof(Float32)
4
julia> sizeof(ComplexF64)
16
julia> sizeof(1.0)
8
julia> sizeof(collect(1.0:10.0))
80
julia> struct StructWithPadding
x::Int64
flag::Bool
end
julia> sizeof(StructWithPadding) # パディングのため、フィールドの `sizeof` の合計ではない
16
julia> sizeof(Int64) + sizeof(Bool) # 上記とは異なる
9DataType T に特定のサイズがない場合、エラーが発生します。
julia> sizeof(AbstractArray)
ERROR: 抽象型 AbstractArray には明確なサイズがありません。
Stacktrace:
[...]Base.isconcretetype — Functionisconcretetype(T)型 T が具体的な型であるかどうかを判断します。具体的な型とは、直接的なインスタンス(typeof(x) === T となる値 x)を持つ可能性がある型を意味します。これは isabstracttype(T) の否定ではないことに注意してください。T が型でない場合は、false を返します。
参照: isbits, isabstracttype, issingletontype.
例
julia> isconcretetype(Complex)
false
julia> isconcretetype(Complex{Float32})
true
julia> isconcretetype(Vector{Complex})
true
julia> isconcretetype(Vector{Complex{Float32}})
true
julia> isconcretetype(Union{})
false
julia> isconcretetype(Union{Int,String})
falseBase.isbits — Functionisbits(x)x が isbitstype 型のインスタンスであれば true を返します。
Base.isbitstype — Functionisbitstype(T)型 T が「プレーンデータ」型である場合、つまり不変であり、他の値への参照を含まず、primitive 型と他の isbitstype 型のみを含む場合は true を返します。典型的な例としては、UInt8、Float64、および Complex{Float64} のような数値型があります。このカテゴリの型は重要であり、型パラメータとして有効であり、isdefined / isassigned ステータスを追跡しない可能性があり、C と互換性のある定義されたレイアウトを持っています。T が型でない場合は、false を返します。
他にも isbits、isprimitivetype、ismutable を参照してください。
例
julia> isbitstype(Complex{Float64})
true
julia> isbitstype(Complex)
falseBase.fieldoffset — Functionfieldoffset(type, i)型のフィールド i のバイトオフセットをデータの開始位置に対して示します。例えば、構造体に関する情報を要約するために次のように使用できます:
julia> structinfo(T) = [(fieldoffset(T,i), fieldname(T,i), fieldtype(T,i)) for i = 1:fieldcount(T)];
julia> structinfo(Base.Filesystem.StatStruct)
14-element Vector{Tuple{UInt64, Symbol, Type}}:
(0x0000000000000000, :desc, Union{RawFD, String})
(0x0000000000000008, :device, UInt64)
(0x0000000000000010, :inode, UInt64)
(0x0000000000000018, :mode, UInt64)
(0x0000000000000020, :nlink, Int64)
(0x0000000000000028, :uid, UInt64)
(0x0000000000000030, :gid, UInt64)
(0x0000000000000038, :rdev, UInt64)
(0x0000000000000040, :size, Int64)
(0x0000000000000048, :blksize, Int64)
(0x0000000000000050, :blocks, Int64)
(0x0000000000000058, :mtime, Float64)
(0x0000000000000060, :ctime, Float64)
(0x0000000000000068, :ioerrno, Int32)Base.datatype_alignment — FunctionBase.datatype_alignment(dt::DataType) -> Intこの型のインスタンスのメモリアロケーションの最小アライメント。isconcretetypeの任意の型に対して呼び出すことができますが、Memoryの場合はオブジェクト全体ではなく要素のアライメントを返します。
Base.datatype_haspadding — FunctionBase.datatype_haspadding(dt::DataType) -> Boolこの型のインスタンスのフィールドがメモリ内でパッキングされているかどうかを返します。すなわち、間にパディングビットがない状態です(パディングビットとは、インスタンス自体の意味的な値に影響を与えないビットとして定義されます)。これは、任意の isconcretetype に対して呼び出すことができます。
Base.datatype_pointerfree — FunctionBase.datatype_pointerfree(dt::DataType) -> Boolこの型のインスタンスがgc管理メモリへの参照を含むことができるかどうかを返します。isconcretetypeの任意のものに対して呼び出すことができます。
Special values
Base.typemin — Functiontypemin(T)指定された(実数の)数値データ型 T によって表現可能な最小値。
例
julia> typemin(Int8)
-128
julia> typemin(UInt32)
0x00000000
julia> typemin(Float16)
-Inf16
julia> typemin(Float32)
-Inf32
julia> nextfloat(-Inf32) # 最小の有限 Float32 浮動小数点数
-3.4028235f38Base.typemax — Functiontypemax(T)指定された(実際の)数値 DataType によって表現可能な最大値。
例
julia> typemax(Int8)
127
julia> typemax(UInt32)
0xffffffff
julia> typemax(Float64)
Inf
julia> typemax(Float32)
Inf32
julia> floatmax(Float32) # 最大の有限の Float32 浮動小数点数
3.4028235f38Base.floatmin — Functionfloatmin(T = Float64)浮動小数点型 T で表現可能な最小の正の正規数を返します。
例
julia> floatmin(Float16)
Float16(6.104e-5)
julia> floatmin(Float32)
1.1754944f-38
julia> floatmin()
2.2250738585072014e-308Base.floatmax — Functionfloatmax(T = Float64)浮動小数点型 T で表現可能な最大の有限数を返します。
例
julia> floatmax(Float16)
Float16(6.55e4)
julia> floatmax(Float32)
3.4028235f38
julia> floatmax()
1.7976931348623157e308
julia> typemax(Float64)
InfBase.maxintfloat — Functionmaxintfloat(T, S)与えられた浮動小数点型 T で表現可能な最大の連続整数であり、かつ整数型 S によって表現可能な最大整数を超えない。言い換えれば、これは maxintfloat(T) と typemax(S) の最小値である。
maxintfloat(T=Float64)与えられた浮動小数点型 T(デフォルトは Float64)で正確に表現される最大の連続整数値の浮動小数点数です。
つまり、maxintfloat は、n+1 が型 T で正確に表現できない最小の正の整数値の浮動小数点数 n を返します。
Integer 型の値が必要な場合は、Integer(maxintfloat(T)) を使用してください。
Base.eps — Methodeps(::Type{T}) where T<:AbstractFloat
eps()浮動小数点型 T の マシンイプシロン を返します(デフォルトでは T = Float64)。これは、1 と typeof(one(T)) で表現可能な次に大きい値との間のギャップとして定義され、eps(one(T)) と同等です。(eps(T) は T の 相対誤差 の上限であるため、one のように「次元のない」量です。)
例
julia> eps()
2.220446049250313e-16
julia> eps(Float32)
1.1920929f-7
julia> 1.0 + eps()
1.0000000000000002
julia> 1.0 + eps()/2
1.0Base.eps — Methodeps(x::AbstractFloat)xの最後の桁の単位(ulp)を返します。これは、xでの連続する表現可能な浮動小数点値の間の距離です。ほとんどの場合、xの両側の距離が異なる場合は、2つのうち大きい方が取られます。つまり、
eps(x) == max(x-prevfloat(x), nextfloat(x)-x)このルールの例外は、最小および最大の有限値(例えば、Float64のnextfloat(-Inf)およびprevfloat(Inf))であり、これらは値の小さい方に丸められます。
この動作の理由は、epsが浮動小数点の丸め誤差を制限することです。デフォルトのRoundNearest丸めモードの下で、$y$が実数であり、$x$が$y$に最も近い浮動小数点数である場合、次の不等式が成り立ちます。
\[|y-x| \leq \operatorname{eps}(x)/2.\]
関連情報: nextfloat, issubnormal, floatmax。
例
julia> eps(1.0)
2.220446049250313e-16
julia> eps(prevfloat(2.0))
2.220446049250313e-16
julia> eps(2.0)
4.440892098500626e-16
julia> x = prevfloat(Inf) # 最大の有限Float64
1.7976931348623157e308
julia> x + eps(x)/2 # 切り上げ
Inf
julia> x + prevfloat(eps(x)/2) # 切り下げ
1.7976931348623157e308Base.instances — Functioninstances(T::Type)指定された型のすべてのインスタンスのコレクションを返します。主に列挙型に使用されます(@enumを参照)。
例
julia> @enum Color red blue green
julia> instances(Color)
(red, blue, green)Special Types
Core.Any — TypeAny::DataTypeAny はすべての型の和です。任意の x に対して isa(x, Any) == true という定義的な性質を持っています。したがって、Any は可能な値の全宇宙を表します。例えば、Integer は Int、Int8、および他の整数型を含む Any のサブセットです。
Core.Union — TypeUnion{Types...}Union型は、その引数型のすべてのインスタンスを含む抽象型です。これは、T <: Union{T,S} および S <: Union{T,S} を意味します。
他の抽象型と同様に、すべての引数が非抽象であっても、インスタンス化することはできません。
例
julia> IntOrString = Union{Int,AbstractString}
Union{Int64, AbstractString}
julia> 1 isa IntOrString # Intのインスタンスはユニオンに含まれています
true
julia> "Hello!" isa IntOrString # Stringも含まれています
true
julia> 1.0 isa IntOrString # Float64はIntでもAbstractStringでもないため含まれていません
falseExtended Help
ほとんどの他のパラメトリック型とは異なり、ユニオンはそのパラメータに対して共変です。たとえば、Union{Real, String}はUnion{Number, AbstractString}のサブタイプです。
空のユニオン Union{} は、Juliaのボトム型です。
Union{} — KeywordUnion{}Union{}、型の空の Union は、型システムの ボトム 型です。つまり、各 T::Type に対して、Union{} <: T です。また、部分型演算子のドキュメントも参照してください: <:。
そのため、Union{} は 空/居住していない 型でもあり、値を持たないことを意味します。つまり、各 x に対して、isa(x, Union{}) == false です。
Base.Bottom はそのエイリアスとして定義されており、Union{} の型は Core.TypeofBottom です。
例
julia> isa(nothing, Union{})
false
julia> Union{} <: Int
true
julia> typeof(Union{}) === Core.TypeofBottom
true
julia> isa(Union{}, Union)
falseCore.UnionAll — TypeUnionAll型パラメータのすべての値に対する型の和。UnionAllは、いくつかのパラメータの値が不明な場合のパラメトリック型を記述するために使用されます。マニュアルのUnionAll Typesのセクションを参照してください。
例
julia> typeof(Vector)
UnionAll
julia> typeof(Vector{Int})
DataTypeCore.Tuple — TypeTuple{Types...}タプルは、異なる型の任意の値を保持できる固定長のコンテナですが、変更することはできません(不変です)。値はインデックスを介してアクセスできます。タプルリテラルはカンマと括弧で書かれます:
julia> (1, 1+1)
(1, 2)
julia> (1,)
(1,)
julia> x = (0.0, "hello", 6*7)
(0.0, "hello", 42)
julia> x[2]
"hello"
julia> typeof(x)
Tuple{Float64, String, Int64}長さ1のタプルはカンマを付けて書かなければなりません (1,)、なぜなら (1) は単に括弧で囲まれた値だからです。() は空の(長さ0の)タプルを表します。
タプルは、コンストラクタとして Tuple 型を使用することでイテレータから構築できます:
julia> Tuple(["a", 1])
("a", 1)
julia> Tuple{String, Float64}(["a", 1])
("a", 1.0)タプル型はそのパラメータに対して共変です:Tuple{Int} は Tuple{Any} のサブタイプです。したがって、Tuple{Any} は抽象型と見なされ、タプル型はそのパラメータが具体的である場合にのみ具体的です。タプルにはフィールド名はなく、フィールドはインデックスによってのみアクセスされます。タプル型は任意の数のパラメータを持つことができます。
タプル型に関するマニュアルのセクションを参照してください。
また、Vararg、NTuple、ntuple、tuple、NamedTupleも参照してください。
Core.NTuple — TypeNTuple{N, T}長さ N のタプルの型を表すコンパクトな方法で、すべての要素は型 T です。
例
julia> isa((1, 2, 3, 4, 5, 6), NTuple{6, Int})
true関連項目 ntuple.
Core.NamedTuple — TypeNamedTupleNamedTupleは、その名前が示すように、名前付きTupleです。つまり、各エントリが一意の名前を持つ、タプルのような値のコレクションです。この名前はSymbolとして表されます。Tupleと同様に、NamedTupleは不変であり、構築後に名前や値をその場で変更することはできません。
名前付きタプルは、キーを持つタプルリテラルとして作成できます。例えば、(a=1, b=2)や、開き括弧の後にセミコロンを付けたタプルリテラルとして、例えば(; a=1, b=2)(この形式は、以下に説明するようにプログラムで生成された名前も受け入れます)や、コンストラクタとしてNamedTuple型を使用して、例えばNamedTuple{(:a, :b)}((1,2))のように作成できます。
名前付きタプル内の名前に関連付けられた値にアクセスするには、フィールドアクセス構文を使用します。例えば、x.aや、getindexを使用して、x[:a]またはx[(:a, :b)]のようにアクセスできます。名前のタプルはkeysを使用して取得でき、値のタプルはvaluesを使用して取得できます。
NamedTupleを反復処理すると、値が名前なしで生成されます。(以下の例を参照してください。)名前と値のペアを反復処理するには、pairs関数を使用してください。
@NamedTupleマクロは、NamedTuple型を便利に宣言するために使用できます。
例
julia> x = (a=1, b=2)
(a = 1, b = 2)
julia> x.a
1
julia> x[:a]
1
julia> x[(:a,)]
(a = 1,)
julia> keys(x)
(:a, :b)
julia> values(x)
(1, 2)
julia> collect(x)
2-element Vector{Int64}:
1
2
julia> collect(pairs(x))
2-element Vector{Pair{Symbol, Int64}}:
:a => 1
:b => 2キーワード引数をプログラム的に定義するのと同様に、名前付きタプルは、タプルリテラル内のセミコロンの後にname::Symbol => valueのペアを指定することで作成できます。この形式とname=value構文は混在させることができます:
julia> (; :a => 1, :b => 2, c=3)
(a = 1, b = 2, c = 3)名前と値のペアは、名前付きタプルをスプラットするか、各シンボルを最初の値として持つ2値コレクションを生成するイテレータを使用して提供することもできます:
julia> keys = (:a, :b, :c); values = (1, 2, 3);
julia> NamedTuple{keys}(values)
(a = 1, b = 2, c = 3)
julia> (; (keys .=> values)...)
(a = 1, b = 2, c = 3)
julia> nt1 = (a=1, b=2);
julia> nt2 = (c=3, d=4);
julia> (; nt1..., nt2..., b=20) # 最後のbはnt1からの値を上書きします
(a = 1, b = 20, c = 3, d = 4)
julia> (; zip(keys, values)...) # zipは(:a, 1)のようなタプルを生成します
(a = 1, b = 2, c = 3)キーワード引数と同様に、識別子とドット式は名前を暗示します:
julia> x = 0
0
julia> t = (; x)
(x = 0,)
julia> (; t.x)
(x = 0,)Base.@NamedTuple — Macro@NamedTuple{key1::Type1, key2::Type2, ...}
@NamedTuple begin key1::Type1; key2::Type2; ...; endこのマクロは、NamedTuple 型を宣言するためのより便利な構文を提供します。与えられたキーと型を持つ NamedTuple 型を返し、これは NamedTuple{(:key1, :key2, ...), Tuple{Type1,Type2,...}} と同等です。::Type 宣言が省略された場合、それは Any と見なされます。begin ... end 形式は、宣言を複数行に分けることを可能にします(struct 宣言に似ています)が、それ以外は同等です。NamedTuple マクロは、NamedTuple 型を印刷する際に使用されます。たとえば、タプル (a=3.1, b="hello") は型 NamedTuple{(:a, :b), Tuple{Float64, String}} を持ち、これは次のように @NamedTuple を使用して宣言することもできます。
julia> @NamedTuple{a::Float64, b::String}
@NamedTuple{a::Float64, b::String}
julia> @NamedTuple begin
a::Float64
b::String
end
@NamedTuple{a::Float64, b::String}Base.@Kwargs — Macro@Kwargs{key1::Type1, key2::Type2, ...}このマクロは、@NamedTupleと同じ構文からキーワード引数の型表現を構築する便利な方法を提供します。例えば、func([位置引数]; kw1=1.0, kw2="2")のような関数呼び出しがある場合、このマクロを使用してキーワード引数の内部型表現を@Kwargs{kw1::Float64, kw2::String}として構築できます。マクロの構文は、スタックトレースビューに印刷されるときにキーワードメソッドのシグネチャ型を簡素化するように特別に設計されています。
julia> @Kwargs{init::Int} # キーワード引数の内部表現
Base.Pairs{Symbol, Int64, Nothing, @NamedTuple{init::Int64}}
julia> sum("julia"; init=1)
ERROR: MethodError: no method matching +(::Char, ::Char)
関数 `+` は存在しますが、この引数の型の組み合わせに対して定義されたメソッドはありません。
最も近い候補は次のとおりです:
+(::Any, ::Any, ::Any, ::Any...)
@ Base operators.jl:585
+(::Integer, ::AbstractChar)
@ Base char.jl:247
+(::T, ::Integer) where T<:AbstractChar
@ Base char.jl:237
スタックトレース:
[1] add_sum(x::Char, y::Char)
@ Base ./reduce.jl:24
[2] BottomRF
@ Base ./reduce.jl:86 [インライン]
[3] _foldl_impl(op::Base.BottomRF{typeof(Base.add_sum)}, init::Int64, itr::String)
@ Base ./reduce.jl:62
[4] foldl_impl(op::Base.BottomRF{typeof(Base.add_sum)}, nt::Int64, itr::String)
@ Base ./reduce.jl:48 [インライン]
[5] mapfoldl_impl(f::typeof(identity), op::typeof(Base.add_sum), nt::Int64, itr::String)
@ Base ./reduce.jl:44 [インライン]
[6] mapfoldl(f::typeof(identity), op::typeof(Base.add_sum), itr::String; init::Int64)
@ Base ./reduce.jl:175 [インライン]
[7] mapreduce(f::typeof(identity), op::typeof(Base.add_sum), itr::String; kw::@Kwargs{init::Int64})
@ Base ./reduce.jl:307 [インライン]
[8] sum(f::typeof(identity), a::String; kw::@Kwargs{init::Int64})
@ Base ./reduce.jl:535 [インライン]
[9] sum(a::String; kw::@Kwargs{init::Int64})
@ Base ./reduce.jl:564 [インライン]
[10] トップレベルスコープ
@ REPL[12]:1Base.Val — TypeVal(c)Val{c}()を返します。これは実行時データを含みません。このような型は、cの値を介して関数間で情報を渡すために使用できます。cはisbits値またはSymbolでなければなりません。この構造の意図は、定数の値を実行時にテストすることなく、コンパイル時に直接定数に基づいてディスパッチできるようにすることです。
例
julia> f(::Val{true}) = "Good"
f (generic function with 1 method)
julia> f(::Val{false}) = "Bad"
f (generic function with 2 methods)
julia> f(Val(true))
"Good"Core.Vararg — ConstantVararg{T,N}タプル型 Tuple の最後のパラメータは、任意の数の末尾要素を示す特別な値 Vararg であることができます。 Vararg{T,N} は、型 T の正確に N 個の要素に対応します。最後に、 Vararg{T} は、型 T のゼロ個以上の要素に対応します。 Vararg タプル型は、可変引数メソッドが受け入れる引数を表すために使用されます(マニュアルの Varargs Functions セクションを参照してください)。
また、 NTuple も参照してください。
例
julia> mytupletype = Tuple{AbstractString, Vararg{Int}}
Tuple{AbstractString, Vararg{Int64}}
julia> isa(("1",), mytupletype)
true
julia> isa(("1",1), mytupletype)
true
julia> isa(("1",1,2), mytupletype)
true
julia> isa(("1",1,2,3.0), mytupletype)
falseCore.Nothing — TypeBase.isnothing — Functionisnothing(x)x === nothing の場合は true を返し、そうでない場合は false を返します。
関連情報として something, Base.notnothing, ismissing を参照してください。
Base.notnothing — Functionnotnothing(x)x === nothing の場合はエラーをスローし、そうでなければ x を返します。
Base.Some — TypeSome{T}Union{Some{T}, Nothing}内で値の欠如(nothing)とnothing値の存在(すなわちSome(nothing))を区別するために使用されるラッパー型です。
Someオブジェクトによってラップされた値にアクセスするにはsomethingを使用してください。
Base.something — Functionsomething(x...)引数の中で nothing と等しくない最初の値を返します。もしそのような値がなければ、エラーをスローします。型 Some の引数はアンラップされます。
関連項目としては coalesce、skipmissing、@something があります。
例
julia> something(nothing, 1)
1
julia> something(Some(1), nothing)
1
julia> something(Some(nothing), 2) === nothing
true
julia> something(missing, nothing)
missing
julia> something(nothing, nothing)
ERROR: ArgumentError: No value arguments presentBase.@something — Macro@something(x...)something のショートサーキットバージョンです。
例
julia> f(x) = (println("f($x)"); nothing);
julia> a = 1;
julia> a = @something a f(2) f(3) error("Unable to find default for `a`")
1
julia> b = nothing;
julia> b = @something b f(2) f(3) error("Unable to find default for `b`")
f(2)
f(3)
ERROR: Unable to find default for `b`
[...]
julia> b = @something b f(2) f(3) Some(nothing)
f(2)
f(3)
julia> b === nothing
trueBase.Enums.Enum — TypeEnum{T<:Integer}@enumで定義されたすべての列挙型の抽象スーパタイプです。
Base.Enums.@enum — Macro@enum EnumName[::BaseType] value1[=x] value2[=y]EnumNameという名前のEnum{BaseType}サブタイプを作成し、オプションで割り当てられた値xとyを持つvalue1とvalue2の列挙メンバー値を持ちます。EnumNameは他の型と同様に使用でき、列挙メンバー値は通常の値として使用できます。例えば、
例
julia> @enum Fruit apple=1 orange=2 kiwi=3
julia> f(x::Fruit) = "I'm a Fruit with value: $(Int(x))"
f (generic function with 1 method)
julia> f(apple)
"I'm a Fruit with value: 1"
julia> Fruit(1)
apple::Fruit = 1値はbeginブロック内でも指定できます。例えば、
@enum EnumName begin
value1
value2
endBaseTypeはデフォルトでInt32であり、Integerのプリミティブサブタイプでなければなりません。メンバー値は列挙型とBaseTypeの間で変換できます。readとwriteはこれらの変換を自動的に行います。非デフォルトのBaseTypeで列挙が作成された場合、Integer(value1)は型BaseTypeの整数value1を返します。
列挙のすべてのインスタンスをリストするにはinstancesを使用します。例えば、
julia> instances(Fruit)
(apple, orange, kiwi)列挙インスタンスからシンボルを構築することも可能です:
julia> Symbol(apple)
:appleCore.Expr — TypeExpr(head::Symbol, args...)解析されたJuliaコード(AST)における複合表現を表す型です。各表現は、どの種類の表現であるかを識別するhead Symbol(例えば、呼び出し、forループ、条件文など)と、サブ表現(例えば、呼び出しの引数)で構成されています。サブ表現は、argsというVector{Any}フィールドに格納されています。
メタプログラミングに関するマニュアルの章と、開発者ドキュメントのJulia ASTsを参照してください。
例
julia> Expr(:call, :+, 1, 2)
:(1 + 2)
julia> dump(:(a ? b : c))
Expr
head: Symbol if
args: Array{Any}((3,))
1: Symbol a
2: Symbol b
3: Symbol cCore.Symbol — TypeSymbol解析されたjuliaコード(AST)で識別子を表すために使用されるオブジェクトの型。エンティティを識別するための名前やラベルとしてもよく使用されます(例:辞書のキーとして)。Symbolsは:引用演算子を使用して入力できます:
julia> :name
:name
julia> typeof(:name)
Symbol
julia> x = 42
42
julia> eval(:x)
42Symbolsは、コンストラクタSymbol(x...)を呼び出すことで文字列や他の値からも構築できます。
Symbolsは不変であり、同じ名前のすべてのSymbolsに対して同じオブジェクトを再利用する実装になっています。
文字列とは異なり、Symbolsは文字を反復処理することをサポートしない「原子的」または「スカラー」エンティティです。
Core.Symbol — MethodSymbol(x...) -> Symbol引数の文字列表現を連結してSymbolを作成します。
例
julia> Symbol("my", "name")
:myname
julia> Symbol("day", 4)
:day4Core.Module — TypeModuleModuleは別のグローバル変数ワークスペースです。詳細についてはmoduleおよびモジュールに関するマニュアルセクションを参照してください。
Module(name::Symbol=:anonymous, std_imports=true, default_names=true)指定された名前のモジュールを返します。baremoduleはModule(:ModuleName, false)に対応します。
名前を全く含まない空のモジュールは、Module(:ModuleName, false, false)を使用して作成できます。このモジュールはBaseやCoreをインポートせず、自身への参照を含みません。
Generic Functions
Core.Function — Type関数すべての関数の抽象型。
例
julia> isa(+, Function)
true
julia> typeof(sin)
typeof(sin) (関数 sin の単一型、Function のサブタイプ)
julia> ans <: Function
trueBase.hasmethod — Functionhasmethod(f, t::Type{<:Tuple}[, kwnames]; world=get_world_counter()) -> Bool与えられたジェネリック関数が、指定された引数の型の Tuple に一致するメソッドを持っているかどうかを判断します。world によって与えられた世界の年齢の上限も考慮されます。
キーワード引数名のタプル kwnames が提供されている場合、これはまた、f のメソッドが t に一致し、指定されたキーワード引数名を持っているかどうかもチェックします。一致するメソッドが可変数のキーワード引数を受け入れる場合、例えば kwargs... のように、kwnames に与えられた名前は有効と見なされます。そうでない場合、提供された名前はメソッドのキーワード引数のサブセットでなければなりません。
詳細は applicable を参照してください。
例
julia> hasmethod(length, Tuple{Array})
true
julia> f(; oranges=0) = oranges;
julia> hasmethod(f, Tuple{}, (:oranges,))
true
julia> hasmethod(f, Tuple{}, (:apples, :bananas))
false
julia> g(; xs...) = 4;
julia> hasmethod(g, Tuple{}, (:a, :b, :c, :d)) # g は任意の kwargs を受け入れる
trueCore.applicable — Functionapplicable(f, args...) -> Bool与えられた汎用関数が与えられた引数に適用可能なメソッドを持っているかどうかを判断します。
関連情報としてhasmethodを参照してください。
例
julia> function f(x, y)
x + y
end;
julia> applicable(f, 1)
false
julia> applicable(f, 1, 2)
trueBase.isambiguous — FunctionBase.isambiguous(m1, m2; ambiguous_bottom=false) -> Bool2つのメソッド m1 と m2 が、ある呼び出しシグネチャに対して曖昧であるかどうかを判断します。このテストは、同じ関数の他のメソッドの文脈で実行されます。孤立している場合、m1 と m2 は曖昧である可能性がありますが、曖昧さを解決する第三のメソッドが定義されている場合、これは false を返します。逆に、孤立している場合、m1 と m2 は順序付けられている可能性がありますが、第三のメソッドがそれらと一緒にソートできない場合、共に曖昧さを引き起こす可能性があります。
パラメトリック型の場合、ambiguous_bottom キーワード引数は、Union{} が型パラメータの曖昧な交差としてカウントされるかどうかを制御します。true の場合、曖昧と見なされ、false の場合はそうではありません。
例
julia> foo(x::Complex{<:Integer}) = 1
foo (generic function with 1 method)
julia> foo(x::Complex{<:Rational}) = 2
foo (generic function with 2 methods)
julia> m1, m2 = collect(methods(foo));
julia> typeintersect(m1.sig, m2.sig)
Tuple{typeof(foo), Complex{Union{}}}
julia> Base.isambiguous(m1, m2, ambiguous_bottom=true)
true
julia> Base.isambiguous(m1, m2, ambiguous_bottom=false)
falseCore.invoke — Functioninvoke(f, argtypes::Type, args...; kwargs...)
invoke(f, argtypes::Method, args...; kwargs...)
invoke(f, argtypes::CodeInstance, args...; kwargs...)指定された引数 args に対して、指定された型 argtypes に一致する与えられた汎用関数 f のメソッドを呼び出します。引数 args は、指定された型 argtypes に準拠している必要があり、すなわち自動的な変換は行われません。このメソッドは、最も特異的な一致メソッド以外のメソッドを呼び出すことを可能にし、より一般的な定義の動作が明示的に必要な場合に便利です(しばしば同じ関数のより特異的なメソッドの実装の一部として)。ただし、これはランタイムがより多くの作業を行う必要があることを意味するため、invoke は通常の呼び出しによる通常のディスパッチよりも遅くなることが一般的です—時にはかなり遅くなることもあります。
自分が書いていない関数に対して invoke を使用する際は注意が必要です。与えられた argtypes に対してどの定義が使用されるかは、関数が特定の argtypes での呼び出しが公開APIの一部であると明示的に述べていない限り、実装の詳細です。例えば、以下の例での f1 と f2 の間の変更は、通常の(非 invoke)呼び出しで呼び出し元からは見えないため、互換性があると見なされます。しかし、invoke を使用すると変更が見えます。
シグネチャの代わりに Method を渡す
argtypes 引数は Method である場合があり、その場合は通常のメソッドテーブルの検索が完全にバイパスされ、与えられたメソッドが直接呼び出されます。この機能が必要なことは稀です。特に、指定された Method が通常のディスパッチ(または通常の invoke)から完全に到達不可能である場合、例えば、より特異的なメソッドによって置き換えられたり完全にカバーされたりしている場合に注意してください。メソッドが通常のメソッドテーブルの一部である場合、この呼び出しは invoke(f, method.sig, args...) に似た動作をします。
シグネチャの代わりに CodeInstance を渡す
argtypes 引数は CodeInstance である場合があり、メソッドの検索と特化の両方をバイパスします。この呼び出しの意味は、CodeInstance の invoke ポインタの関数ポインタ呼び出しに似ています。引数がその親 MethodInstance に一致しない場合や、min_world/max_world 範囲に含まれないワールドエイジから CodeInstance を呼び出すことはエラーです。フィールドに指定された制約に一致しない動作を持つ CodeInstance を呼び出すことは未定義の動作です。owner !== nothing のコードインスタンス(すなわち、外部コンパイラによって生成されたもの)に対しては、プリコンパイルを通過した後に呼び出すことがエラーになる場合があります。これは外部コンパイラプラグインと共に使用するための高度なインターフェースです。
例
julia> f(x::Real) = x^2;
julia> f(x::Integer) = 1 + invoke(f, Tuple{Real}, x);
julia> f(2)
5
julia> f1(::Integer) = Integer
f1(::Real) = Real;
julia> f2(x::Real) = _f2(x)
_f2(::Integer) = Integer
_f2(_) = Real;
julia> f1(1)
Integer
julia> f2(1)
Integer
julia> invoke(f1, Tuple{Real}, 1)
Real
julia> invoke(f2, Tuple{Real}, 1)
IntegerBase.@invoke — Macro@invoke f(arg::T, ...; kwargs...)invokeを呼び出す便利な方法を提供し、@invoke f(arg1::T1, arg2::T2; kwargs...)をinvoke(f, Tuple{T1,T2}, arg1, arg2; kwargs...)に展開します。引数の型アノテーションが省略されると、その引数のCore.Typeofに置き換えられます。引数が型指定されていないか、明示的にAnyとして型指定されているメソッドを呼び出すには、引数に::Anyでアノテーションを付けます。
以下の構文もサポートしています:
@invoke (x::X).fはinvoke(getproperty, Tuple{X,Symbol}, x, :f)に展開されます@invoke (x::X).f = v::Vはinvoke(setproperty!, Tuple{X,Symbol,V}, x, :f, v)に展開されます@invoke (xs::Xs)[i::I]はinvoke(getindex, Tuple{Xs,I}, xs, i)に展開されます@invoke (xs::Xs)[i::I] = v::Vはinvoke(setindex!, Tuple{Xs,V,I}, xs, v, i)に展開されます
例
julia> @macroexpand @invoke f(x::T, y)
:(Core.invoke(f, Tuple{T, Core.Typeof(y)}, x, y))
julia> @invoke 420::Integer % Unsigned
0x00000000000001a4
julia> @macroexpand @invoke (x::X).f
:(Core.invoke(Base.getproperty, Tuple{X, Core.Typeof(:f)}, x, :f))
julia> @macroexpand @invoke (x::X).f = v::V
:(Core.invoke(Base.setproperty!, Tuple{X, Core.Typeof(:f), V}, x, :f, v))
julia> @macroexpand @invoke (xs::Xs)[i::I]
:(Core.invoke(Base.getindex, Tuple{Xs, I}, xs, i))
julia> @macroexpand @invoke (xs::Xs)[i::I] = v::V
:(Core.invoke(Base.setindex!, Tuple{Xs, V, I}, xs, v, i))Base.invokelatest — Functioninvokelatest(f, args...; kwargs...)f(args...; kwargs...)を呼び出しますが、fの最も最近のメソッドが実行されることを保証します。これは、長時間実行されるイベントループや、古いバージョンの関数fを呼び出す可能性のあるコールバック関数など、特定の状況で便利です。(欠点は、invokelatestはfを直接呼び出すよりも若干遅く、結果の型をコンパイラが推論できないことです。)
Base.@invokelatest — Macro@invokelatest f(args...; kwargs...)invokelatestを呼び出すための便利な方法を提供します。@invokelatest f(args...; kwargs...)は単にBase.invokelatest(f, args...; kwargs...)に展開されます。
以下の構文もサポートしています:
@invokelatest x.fはBase.invokelatest(getproperty, x, :f)に展開されます@invokelatest x.f = vはBase.invokelatest(setproperty!, x, :f, v)に展開されます@invokelatest xs[i]はBase.invokelatest(getindex, xs, i)に展開されます@invokelatest xs[i] = vはBase.invokelatest(setindex!, xs, v, i)に展開されます
new — Keywordnew, or new{A,B,...}特別な関数で、内部コンストラクタに利用可能で、型の新しいオブジェクトを作成します。形式 new{A,B,...} は、パラメトリック型のパラメータの値を明示的に指定します。詳細については、Inner Constructor Methods のマニュアルセクションを参照してください。
Base.:|> — Function|>(x, f)引数 x に関数 f を適用する中置演算子です。これにより f(g(x)) を x |> g |> f と書くことができます。無名関数と一緒に使用する場合、意図したチェーンを得るために定義の周りに括弧が必要になることが一般的です。
例
julia> 4 |> inv
0.25
julia> [2, 3, 5] |> sum |> inv
0.1
julia> [0 1; 2 3] .|> (x -> x^2) |> sum
14Base.:∘ — Functionf ∘ g関数の合成:すなわち、(f ∘ g)(args...; kwargs...) は f(g(args...; kwargs...)) を意味します。∘ シンボルは、Julia REPL(および適切に設定されたほとんどのエディタ)で \circ<tab> と入力することで入力できます。
関数の合成はプレフィックス形式でも機能します:∘(f, g) は f ∘ g と同じです。プレフィックス形式は複数の関数の合成をサポートします:∘(f, g, h) = f ∘ g ∘ h および iterable コレクションの関数を合成するためのスプラッティング ∘(fs...)。∘ の最後の引数が最初に実行されます。
例
julia> map(uppercase∘first, ["apple", "banana", "carrot"])
3-element Vector{Char}:
'A': ASCII/Unicode U+0041 (category Lu: Letter, uppercase)
'B': ASCII/Unicode U+0042 (category Lu: Letter, uppercase)
'C': ASCII/Unicode U+0043 (category Lu: Letter, uppercase)
julia> (==(6)∘length).(["apple", "banana", "carrot"])
3-element BitVector:
0
1
1
julia> fs = [
x -> 2x
x -> x-1
x -> x/2
x -> x+1
];
julia> ∘(fs...)(3)
2.0他にも ComposedFunction、!f::Function を参照してください。
Base.ComposedFunction — TypeComposedFunction{Outer,Inner} <: Function二つの呼び出し可能なオブジェクト outer::Outer と inner::Inner の合成を表します。つまり、
ComposedFunction(outer, inner)(args...; kw...) === outer(inner(args...; kw...))ComposedFunction のインスタンスを構築するための推奨される方法は、合成演算子 ∘ を使用することです:
julia> sin ∘ cos === ComposedFunction(sin, cos)
true
julia> typeof(sin∘cos)
ComposedFunction{typeof(sin), typeof(cos)}合成された部分は ComposedFunction のフィールドに格納され、次のように取得できます:
julia> composition = sin ∘ cos
sin ∘ cos
julia> composition.outer === sin
true
julia> composition.inner === cos
true関連情報として ∘ を参照してください。
Base.splat — Functionsplat(f)は次のように等価です。
my_splat(f) = args->f(args...)すなわち、関数を与えると、新しい関数を返し、それは1つの引数を取り、それを元の関数にスプラットします。これは、複数の引数を持つ関数を、単一の引数を期待するコンテキストに渡すためのアダプタとして便利ですが、その単一の引数としてタプルを渡します。
例
julia> map(splat(+), zip(1:3,4:6))
3-element Vector{Int64}:
5
7
9
julia> my_add = splat(+)
splat(+)
julia> my_add((1,2,3))
6Base.Fix — TypeFix{N}(f, x)関数 f の部分適用バージョンを表す型で、引数 x が位置 N::Int に固定されています。言い換えれば、Fix{3}(f, x) は (y1, y2, y3...; kws...) -> f(y1, y2, x, y3...; kws...) と同様に動作します。
Base.Fix1 — TypeFix{1}のエイリアスです。Fixを参照してください。
Base.Fix2 — TypeFix{2}のエイリアスです。Fixを参照してください。
Syntax
Core.eval — FunctionCore.eval(m::Module, expr)指定されたモジュール内で式を評価し、結果を返します。
eval — Functioneval(expr)モジュールのグローバルスコープで式を評価します。すべての Module(baremodule で定義されたものを除く)は、モジュール内で使用するために、そのモジュール内の式を評価するプライベートな1引数の eval 定義を持っています。
Base.@eval — Macro@eval [mod,] exevalを使用して、値を補間した式を評価します。2つの引数が提供される場合、最初の引数は評価するモジュールです。
Base.evalfile — Functionevalfile(path::AbstractString, args::Vector{String}=String[])ファイルを匿名モジュールに読み込み、includeを使用してすべての式を評価し、最後の式の値を返します。オプションのargs引数は、スクリプトの入力引数(すなわち、グローバルARGS変数)を設定するために使用できます。定義(例:メソッド、グローバル)は匿名モジュール内で評価され、現在のモジュールには影響を与えないことに注意してください。
例
julia> write("testfile.jl", """
@show ARGS
1 + 1
""");
julia> x = evalfile("testfile.jl", ["ARG1", "ARG2"]);
ARGS = ["ARG1", "ARG2"]
julia> x
2
julia> rm("testfile.jl")Base.esc — Functionesc(e)マクロから返されたExprのコンテキスト内でのみ有効です。マクロの衛生パスが埋め込まれた変数をgensym変数に変換するのを防ぎます。詳細と例については、マニュアルのメタプログラミング章のMacrosセクションを参照してください。
Base.@inbounds — Macro@inbounds(blk)式内での配列境界チェックを排除します。
以下の例では、配列 A の要素 i を参照するための範囲内チェックがスキップされ、パフォーマンスが向上します。
function sum(A::AbstractArray)
r = zero(eltype(A))
for i in eachindex(A)
@inbounds r += A[i]
end
return r
endBase.@boundscheck — Macro@boundscheck(blk)式 blk を境界チェックブロックとして注釈付けし、@inbounds によって省略されることを許可します。
例
julia> @inline function g(A, i)
@boundscheck checkbounds(A, i)
return "accessing ($A)[$i]"
end;
julia> f1() = return g(1:2, -1);
julia> f2() = @inbounds return g(1:2, -1);
julia> f1()
ERROR: BoundsError: attempt to access 2-element UnitRange{Int64} at index [-1]
Stacktrace:
[1] throw_boundserror(::UnitRange{Int64}, ::Tuple{Int64}) at ./abstractarray.jl:455
[2] checkbounds at ./abstractarray.jl:420 [inlined]
[3] g at ./none:2 [inlined]
[4] f1() at ./none:1
[5] top-level scope
julia> f2()
"accessing (1:2)[-1]"@boundscheck 注釈は、ライブラリ作成者として、他のコード が @inbounds を使用してあなたの境界チェックを削除することを許可するためのオプトインを可能にします。そこに記載されているように、呼び出し元は、@inbounds を使用する前に、自分がアクセスする情報を使用して、そのアクセスが有効であることを確認する必要があります。たとえば、あなたの AbstractArray サブクラスへのインデックス付けでは、インデックスをその axes と照らし合わせて確認することが含まれます。したがって、@boundscheck 注釈は、その動作が正しいことが確実である場合にのみ、getindex または setindex! 実装に追加されるべきです。
Base.@propagate_inbounds — Macro@propagate_inboundsコンパイラに、呼び出し元の inbounds コンテキストを保持しながら関数をインライン化するよう指示します。
Base.@inline — Macro@inlineコンパイラにこの関数をインライン化する価値があることを示します。
小さな関数は通常、@inline アノテーションを必要とせず、コンパイラが自動的に処理します。大きな関数に @inline を使用することで、コンパイラにインライン化を促す追加の後押しを与えることができます。
@inline は関数定義の直前または関数本体内で適用できます。
# 長い定義にアノテーションを付ける
@inline function longdef(x)
...
end
# 短い定義にアノテーションを付ける
@inline shortdef(x) = ...
# `do` ブロックが作成する無名関数にアノテーションを付ける
f() do
@inline
...
end@inline blockblock 内の呼び出しがインライン化する価値があることをコンパイラに示します。
# コンパイラは `f` をインライン化しようとします
@inline f(...)
# コンパイラは `f`、`g`、および `+` をインライン化しようとします
@inline f(...) + g(...)呼び出し元のアノテーションは、呼び出された関数の定義に適用されたアノテーションよりも常に優先されます:
@noinline function explicit_noinline(args...)
# 本体
end
let
@inline explicit_noinline(args...) # これはインライン化されます
endネストされた呼び出し元のアノテーションがある場合、最も内側のアノテーションが優先されます:
@noinline let a0, b0 = ...
a = @inline f(a0) # コンパイラはこの呼び出しをインライン化しようとします
b = f(b0) # コンパイラはこの呼び出しをインライン化しようとはしません
return a, b
endBase.@noinline — Macro@noinlineコンパイラに関数をインライン化しないようにヒントを与えます。
小さな関数は通常自動的にインライン化されます。小さな関数に @noinline を使用することで、自動インライン化を防ぐことができます。
@noinline は関数定義の直前または関数本体内で適用できます。
# 長い定義に注釈を付ける
@noinline function longdef(x)
...
end
# 短い定義に注釈を付ける
@noinline shortdef(x) = ...
# `do` ブロックが作成する無名関数に注釈を付ける
f() do
@noinline
...
end@noinline blockコンパイラに block 内の呼び出しをインライン化しないようにヒントを与えます。
# コンパイラは `f` をインライン化しないように試みます
@noinline f(...)
# コンパイラは `f`、`g` および `+` をインライン化しないように試みます
@noinline f(...) + g(...)呼び出しサイトの注釈は、呼び出された関数の定義に適用された注釈よりも常に優先されます:
@inline function explicit_inline(args...)
# 本体
end
let
@noinline explicit_inline(args...) # インライン化されません
endネストされた呼び出しサイトの注釈がある場合、最も内側の注釈が優先されます:
@inline let a0, b0 = ...
a = @noinline f(a0) # コンパイラはこの呼び出しをインライン化しようとしません
b = f(b0) # コンパイラはこの呼び出しをインライン化しようとします
return a, b
endBase.@nospecialize — Macro@nospecialize関数引数名に適用されると、コンパイラに対してその引数の異なる型に対してメソッド実装を特化させず、代わりにその引数の宣言された型を使用するようにヒントを与えます。これは、形式的な引数リスト内の引数や関数本体内の引数に適用できます。引数に適用される場合、マクロは引数の全体の式をラップする必要があります。例えば、@nospecialize(x::Real)や@nospecialize(i::Integer...)のように、引数名だけをラップするのではありません。関数本体で使用される場合、マクロは文の位置にあり、任意のコードの前に出現する必要があります。
引数なしで使用されると、親スコープのすべての引数に適用されます。ローカルスコープでは、これは含まれる関数のすべての引数を意味します。グローバル(トップレベル)スコープでは、これは現在のモジュールでその後に定義されるすべてのメソッドを意味します。
特化は、@specializeを使用することでデフォルトにリセットできます。
function example_function(@nospecialize x)
...
end
function example_function(x, @nospecialize(y = 1))
...
end
function example_function(x, y, z)
@nospecialize x y
...
end
@nospecialize
f(y) = [x for x in y]
@specialize@nospecializeはコード生成に影響を与えますが、推論には影響を与えません:生成されるネイティブコードの多様性を制限しますが、型推論に対しては(標準的な制限を超えて)制限を課しません。推論を追加で抑制するために、@nospecializeと一緒にBase.@nospecializeinferを使用してください。
例
julia> f(A::AbstractArray) = g(A)
f (generic function with 1 method)
julia> @noinline g(@nospecialize(A::AbstractArray)) = A[1]
g (generic function with 1 method)
julia> @code_typed f([1.0])
CodeInfo(
1 ─ %1 = invoke Main.g(_2::AbstractArray)::Float64
└── return %1
) => Float64ここで、@nospecializeアノテーションは次のように等価になります。
f(A::AbstractArray) = invoke(g, Tuple{AbstractArray}, A)これにより、gのためにネイティブコードの1つのバージョンのみが生成されることが保証され、これは任意のAbstractArrayに対して一般的なものです。しかし、特定の戻り値の型は、gとfの両方に対して依然として推論され、これはfとgの呼び出し元の最適化に使用されます。
Base.@specialize — Macro@specialize引数の特化ヒントをデフォルトにリセットします。詳細については、@nospecializeを参照してください。
Base.@nospecializeinfer — MacroBase.@nospecializeinfer function f(args...)
@nospecialize ...
...
end
Base.@nospecializeinfer f(@nospecialize args...) = ...コンパイラに@nospecializeされた引数の宣言された型を使用してfを推論するよう指示します。これは、推論中にコンパイラ生成の特殊化の数を制限するために使用できます。
例
julia> f(A::AbstractArray) = g(A)
f (generic function with 1 method)
julia> @noinline Base.@nospecializeinfer g(@nospecialize(A::AbstractArray)) = A[1]
g (generic function with 1 method)
julia> @code_typed f([1.0])
CodeInfo(
1 ─ %1 = invoke Main.g(_2::AbstractArray)::Any
└── return %1
) => Anyこの例では、fはAの各特定の型に対して推論されますが、gは宣言された引数型A::AbstractArrayで一度だけ推論されるため、コンパイラはそれに対して過剰な推論時間を見ない可能性が高く、具体的な戻り値の型を推論できません。@nospecializeinferがなければ、f([1.0])はgの戻り値の型をFloat64として推論し、専門化されたコード生成が禁止されているにもかかわらず、g(::Vector{Float64})のために推論が実行されたことを示します。
Base.@constprop — MacroBase.@constprop setting [ex]注釈付き関数のための手続き間定数伝播のモードを制御します。
サポートされている setting は2つあります:
Base.@constprop :aggressive [ex]: 定数伝播を積極的に適用します。戻り値の型が引数の値に依存するメソッドの場合、追加のコンパイル時間のコストで推論結果が改善される可能性があります。Base.@constprop :none [ex]: 定数伝播を無効にします。これにより、Juliaが定数伝播に値すると思われる関数のコンパイル時間を短縮できます。一般的なケースは、BoolまたはSymbol値の引数やキーワード引数を持つ関数です。
Base.@constprop は、関数定義の直前または関数本体内で適用できます。
# 長形式の定義に注釈を付ける
Base.@constprop :aggressive function longdef(x)
...
end
# 短形式の定義に注釈を付ける
Base.@constprop :aggressive shortdef(x) = ...
# `do` ブロックが作成する無名関数に注釈を付ける
f() do
Base.@constprop :aggressive
...
endBase.gensym — Functiongensym([tag])他の変数名(同じモジュール内)と衝突しないシンボルを生成します。
Base.@gensym — Macro@gensym変数のためのgensymシンボルを生成します。例えば、@gensym x yはx = gensym("x"); y = gensym("y")に変換されます。
var"name" — Keywordvar構文 var"#example#" は、Symbol("#example#") という名前の変数を指しますが、#example# は有効な Julia 識別子名ではありません。
これは、有効な識別子の構築に関する異なるルールを持つプログラミング言語との相互運用性に役立ちます。たとえば、R 変数 draw.segments を参照するには、Julia コード内で var"draw.segments" を使用できます。
また、マクロの衛生を経た Julia ソースコードや、通常は解析できない変数名を含むコードを show するためにも使用されます。
この構文はパーサーのサポートを必要とするため、通常の文字列マクロ @var_str として実装されるのではなく、パーサーによって直接展開されます。
Base.@goto — Macro@goto name@goto name は、@label name の位置にあるステートメントに無条件でジャンプします。
@label と @goto は、異なるトップレベルのステートメントへのジャンプを作成することはできません。試みるとエラーが発生します。@goto を使用するには、@label と @goto をブロック内に囲む必要があります。
Base.@label — Macro@label nameシンボリックラベル name でステートメントにラベルを付けます。このラベルは、@goto name を使用した無条件ジャンプの終点を示します。
Base.SimdLoop.@simd — Macro@simd@simd for ループで反復されるオブジェクトは、一次元の範囲である必要があります。 @simd を使用することで、ループのいくつかの特性を主張しています:
- 繰り返しを任意または重複した順序で実行することが安全であり、特に還元変数に関して考慮されます。
- 還元変数に対する浮動小数点演算は再配置または収束させることができ、
@simdを使用しない場合とは異なる結果を引き起こす可能性があります。
多くの場合、Julia は @simd を使用せずに内部の for ループを自動的にベクトル化することができます。 @simd を使用することで、コンパイラはより多くの状況でそれを可能にするための少し余裕を持つことができます。いずれの場合でも、内部ループはベクトル化を許可するために次の特性を持っている必要があります:
- ループは最も内側のループでなければなりません。
- ループ本体は直線的なコードでなければなりません。したがって、
@inboundsはすべての配列アクセスに現在必要です。コンパイラは、すべてのオペランドを無条件に評価することが安全である場合、短い&&、||、および?:の式を直線的なコードに変換することがあります。ループ内で安全に行える場合は、?:の代わりにifelse関数を使用することを検討してください。 - アクセスはストライドパターンを持っている必要があり、「ギャザー」(ランダムインデックスの読み取り)や「スキャッター」(ランダムインデックスの書き込み)であってはなりません。
- ストライドは単位ストライドである必要があります。
@simd はデフォルトでループがループキャリードメモリ依存性から完全に自由であることを主張しません。これは、一般的なコードでは簡単に違反される仮定です。非一般的なコードを書いている場合は、@simd ivdep for ... end を使用して、次のことも主張できます:
- ループキャリードメモリ依存性は存在しない
- どの反復も、前の反復が前進するのを待つことはありません。
Base.@polly — Macro@pollyコンパイラにポリヘドラルオプティマイザPollyを関数に適用するよう指示します。
Base.@generated — Macro@generated f@generated は生成される関数に注釈を付けるために使用されます。生成された関数の本体では、引数の型のみを読み取ることができます(値は読み取れません)。この関数は、関数が呼び出されたときに評価される引用された式を返します。@generated マクロは、グローバルスコープを変更する関数や可変要素に依存する関数には使用すべきではありません。
詳細については Metaprogramming を参照してください。
例
julia> @generated function bar(x)
if x <: Integer
return :(x ^ 2)
else
return :(x)
end
end
bar (generic function with 1 method)
julia> bar(4)
16
julia> bar("baz")
"baz"Base.@assume_effects — MacroBase.@assume_effects 設定... [ex]コンパイラの効果モデリングをオーバーライドします。このマクロは、いくつかのコンテキストで使用できます。
- メソッド定義の直前に、適用されたメソッドの全体的な効果モデリングをオーバーライドするために。
- 引数なしの関数本体内で、囲むメソッドの全体的な効果モデリングをオーバーライドするために。
- コードブロックに適用して、適用されたコードブロックのローカルな効果モデリングをオーバーライドするために。
例
julia> Base.@assume_effects :terminates_locally function fact(x)
# 使用例 1:
# この :terminates_locally により `fact` が定数折りたたみされることが許可される
res = 1
0 ≤ x < 20 || error("bad fact")
while x > 1
res *= x
x -= 1
end
return res
end
fact (generic function with 1 method)
julia> code_typed() do
fact(12)
end |> only
CodeInfo(
1 ─ return 479001600
) => Int64
julia> code_typed() do
map((2,3,4)) do x
# 使用例 2:
# この :terminates_locally によりこの匿名関数が定数折りたたみされることが許可される
Base.@assume_effects :terminates_locally
res = 1
0 ≤ x < 20 || error("bad fact")
while x > 1
res *= x
x -= 1
end
return res
end
end |> only
CodeInfo(
1 ─ return (2, 6, 24)
) => Tuple{Int64, Int64, Int64}
julia> code_typed() do
map((2,3,4)) do x
res = 1
0 ≤ x < 20 || error("bad fact")
# 使用例 3:
# この :terminates_locally アノテーションによりコンパイラは汚染をスキップする
# この `while` ブロック内の `:terminates` 効果を許可し、親
# 匿名関数が定数折りたたみされることを可能にする
Base.@assume_effects :terminates_locally while x > 1
res *= x
x -= 1
end
return res
end
end |> only
CodeInfo(
1 ─ return (2, 6, 24)
) => Tuple{Int64, Int64, Int64}このマクロの不適切な使用は未定義の動作を引き起こす可能性があります(クラッシュ、不正確な回答、または追跡が困難なバグを含む)。注意して使用し、絶対に必要な場合にのみ最後の手段として使用してください。そのような場合でも、効果の主張の強さを最小限に抑えるために可能な限りの手段を講じるべきです(例::nothrow が十分であった場合は :total を使用しない)。
一般に、各 setting 値は、関数の動作に関する主張を行いますが、コンパイラにこの動作が実際に真であることを証明させる必要はありません。これらの主張はすべてのワールドエイジに対して行われます。したがって、後で拡張されて仮定を無効にする可能性のある一般的な関数の使用を制限することが推奨されます(これは未定義の動作を引き起こす可能性があります)。
以下の setting がサポートされています。
:consistent:effect_free:nothrow:terminates_globally:terminates_locally:notaskstate:inaccessiblememonly:noub:noub_if_noinbounds:nortcall:foldable:removable:total
Extended help
:consistent
:consistent 設定は、等価 (===) 入力に対して次のことを主張します:
- 終了の方法(戻り値、例外、非終了)は常に同じである。
- メソッドが戻る場合、結果は常に等価である。
:consistent-cy の主張は、特定のワールド範囲 R に関して行われます。より正式には、$fᵢ$ をワールドエイジ $i$ における $f$ の評価と書くと、この設定は次のことを要求します:
\[∀ i ∈ R, j ∈ R, x, y: x ≡ y → fᵢ(x) ≡ fⱼ(y)\]
@assume_effects に対して、範囲 R はアノテーションされたまたは含まれるメソッドの m.primary_world:m.deleted_world です。
通常のコードインスタンスに対して、R は ci.min_world:ci.max_world です。
さらに、:consistent 関数は、返り値をヒープの状態や与えられたワールドエイジ範囲内で一定でない他のグローバル状態に依存させることはできません。
:consistent-cy には、最適化によって行われるすべての合法的な書き換えが含まれます。たとえば、浮動小数点の fastmath 操作は :consistent と見なされません。なぜなら、最適化によって書き換えられる可能性があり、出力が同じワールドエイジに対して :consistent でなくなるからです(例:一方がインタプリタで実行され、もう一方が最適化された場合など)。
:effect_free
:effect_free 設定は、メソッドが外部的に意味的に可視な副作用がないことを主張します。以下は、外部的に意味的に可視な副作用の不完全なリストです:
- グローバル変数の値を変更すること。
- ヒープを変更すること(例:配列や可変値)、ただし以下に記載されている場合を除く。
- メソッドテーブルを変更すること(例:eval への呼び出しを通じて)。
- ファイル/ネットワーク/etc. I/O。
- タスクの切り替え。
ただし、以下は明示的に意味的に可視ではありませんが、観察可能である場合があります:
- メモリ割り当て(可変および不変の両方)。
- 経過時間。
- ガーベジコレクション。
- メソッドのライフタイムを超えないオブジェクトのヒープの変更(すなわち、メソッド内で割り当てられ、エスケープしないもの)。
- 戻り値(外部的に可視ですが、副作用ではありません)。
ここでのルールは、外部的に可視な副作用は、関数が実行されなかった場合にプログラムの残りの部分の実行に影響を与えるものです。
:effect_free の主張は、メソッド自体とメソッドによって実行されるコードの両方に対して行われます。この主張はすべてのワールドエイジに対して有効である必要があり、この主張の使用をそれに応じて制限してください。
:nothrow
:nothrow 設定は、このメソッドが例外をスローしないことを主張します(すなわち、常に値を返すか、決して戻らないことを意味します)。
メソッドの実行が MethodError や類似の例外を引き起こす可能性がある場合、そのメソッドは :nothrow と見なされません。ただし、StackOverflowError や InterruptException のような環境依存のエラーはこの効果によってモデル化されず、したがって StackOverflowError を引き起こす可能性のあるメソッドは必ずしも !:nothrow である必要はありません(ただし、通常は !:terminates であるべきです)。
:terminates_globally
:terminates_globally 設定は、このメソッドが最終的に終了することを主張します(通常または異常に)、すなわち無限ループに陥らないことを意味します。
:terminates_locally
:terminates_locally 設定は :terminates_globally と似ていますが、アノテーションされたメソッド内の構文的制御フローにのみ適用されます。したがって、メソッドが他のメソッドを呼び出す場合に非終了の可能性を許可する、はるかに弱い(したがって安全な)主張です。
:notaskstate
:notaskstate 設定は、メソッドがローカルタスク状態(タスクローカルストレージ、RNG状態など)を使用または変更しないことを主張し、したがって観察可能な結果なしにタスク間で安全に移動できることを意味します。
例外処理の実装は、タスクオブジェクトに保存された状態を使用します。ただし、この状態は現在 :notaskstate の範囲内とは見なされず、:nothrow 効果を使用して別々に追跡されます。
:notaskstate の主張は、現在実行中のタスク の状態に関するものです。現在実行中のタスクを考慮しない他の手段によって Task オブジェクトへの参照が取得された場合、:notaskstate 効果は汚染される必要はありません。これは、該当するタスクオブジェクトが現在実行中のタスクと === である場合でも当てはまります。
タスク状態へのアクセスは、通常、他の効果の汚染(タスク状態が変更された場合は :effect_free、結果の計算にタスク状態が使用された場合は :consistent)を引き起こします。特に、:notaskstate ではないが、:effect_free および :consistent であるコードは、デッドコード削除され、したがって :total に昇格される可能性があります。
:inaccessiblememonly
:inaccessiblememonly 設定は、メソッドが外部からアクセス可能な可変メモリにアクセスまたは変更しないことを主張します。これは、メソッドが他のメソッドやトップレベルの実行から戻る前にアクセスできない新しく割り当てられたオブジェクトの可変メモリにアクセスまたは変更できることを意味しますが、グローバルな可変状態や引数によって指される可変メモリにはアクセスまたは変更できません。
以下は、この仮定を無効にする不完全なリストの例です:
- 可変グローバル変数にアクセスするためのグローバル参照または
getglobal呼び出し - 非定数のグローバル変数に代入を行うためのグローバル代入または
setglobal!呼び出し - グローバル可変変数のフィールドを変更する
setfield!呼び出し
:noub
:noub 設定は、メソッドが未定義の動作を実行しないことを主張します(任意の入力に対して)。未定義の動作は、技術的にはメソッドが他の効果の主張(例::consistent や :effect_free)を違反する原因となる可能性がありますが、これをモデル化せず、未定義の動作がないことを前提とします。
:nortcall
:nortcall 設定は、メソッドが Core.Compiler.return_type を呼び出さず、このメソッドが呼び出す可能性のある他のメソッドも Core.Compiler.return_type を呼び出さないことを主張します。
正確には、この主張は、Core.Compiler.return_type への呼び出しが実行時に行われない場合に使用できます。すなわち、Core.Compiler.return_type の結果がコンパイル時に正確に知られており、呼び出しが最適化によって排除される場合です。ただし、Core.Compiler.return_type の結果がコンパイル時に折りたたまれるかどうかはコンパイラの実装に大きく依存するため、該当するメソッドが Core.Compiler.return_type を何らかの形で使用している場合、これを主張するのは一般的にリスクがあります。
:foldable
この設定は、コンパイラがコンパイル時に呼び出しを定数折りたたみするために保証される必要がある効果のセットの便利なショートカットです。現在、次の setting に相当します:
:consistent:effect_free:terminates_globally:noub:nortcall
このリストには特に :nothrow は含まれていません。コンパイラは、定数伝播を試み、コンパイル時にスローされたエラーを記録します。ただし、:consistent-cy の要件により、そのようにアノテーションされた呼び出しは、同じ引数値に対して一貫してスローされる必要があります。
:removable
この設定は、コンパイラがコンパイル時に結果が未使用の呼び出しを削除することを保証するために必要な効果のセットの便利なショートカットです。現在、次の setting に相当します:
:effect_free:nothrow:terminates_globally
:total
この setting は、可能な最大の効果のセットです。現在、次の他の setting を含意します:
:consistent:effect_free:nothrow:terminates_globally:notaskstate:inaccessiblememonly:noub:nortcall
:total は非常に強い主張であり、将来の Julia のバージョンで追加の意味を持つ可能性があります(例:追加の効果が追加され、:total の定義に含まれる場合)。その結果、注意して使用する必要があります。可能な限り、特定のアプリケーションに必要な最小限の特定の効果の主張を使用することをお勧めします。多くの効果のオーバーライドが一連の関数に適用される場合、:total の使用よりもカスタムマクロを推奨します。
否定された効果
効果名は、! を接頭辞として付けることで、以前のメタ効果から効果を削除することを示すことができます。たとえば、:total !:nothrow は、呼び出しが一般的にはトータルであるが、スローする可能性があることを示します。
Managing deprecations
Base.@deprecate — Macro@deprecate old new [export_old=true]メソッド old を非推奨にし、置き換え呼び出し new を指定し、その過程で指定されたシグネチャの新しいメソッド old を定義します。
old がエクスポートされないようにするには、export_old を false に設定します。
Base.depwarn() も参照してください。
Julia 1.5 以降、@deprecate によって定義された関数は、--depwarn=yes フラグが設定されていない場合に警告を表示しません。デフォルトの --depwarn オプションの値は no です。警告は Pkg.test() によって実行されるテストから表示されます。
例
julia> @deprecate old_export(x) new(x)
old_export (generic function with 1 method)
julia> @deprecate old_public(x) new(x) false
old_public (generic function with 1 method)明示的な型アノテーションなしでの @deprecate への呼び出しは、任意の数の位置引数およびキーワード引数を Any 型で受け入れる非推奨メソッドを定義します。
明示的な型アノテーションがない場合、キーワード引数は Julia 1.9 以降に転送されます。古いバージョンでは、@deprecate old(args...; kwargs...) new(args...; kwargs...) を行うことで、位置引数とキーワード引数を手動で転送できます。
特定のシグネチャに非推奨を制限するには、old の引数にアノテーションを付けます。例えば、
julia> new(x::Int) = x;
julia> new(x::Float64) = 2x;
julia> @deprecate old(x::Int) new(x);
julia> methods(old)
# 1 method for generic function "old" from Main:
[1] old(x::Int64)
@ deprecated.jl:94は、new(x::Int) を反映する old(x::Int) というメソッドを定義し非推奨にしますが、old(x::Float64) というメソッドは定義せず、非推奨にもなりません。
Base.depwarn — FunctionBase.depwarn(msg::String, funcsym::Symbol; force=false)msgを非推奨警告として印刷します。シンボルfuncsymは呼び出し関数の名前であり、各呼び出し場所に対して非推奨警告が最初の呼び出し時にのみ印刷されることを保証するために使用されます。force=trueを設定すると、Juliaが--depwarn=no(デフォルト)で起動されていても、警告が常に表示されるように強制されます。
@deprecateも参照してください。
例
function deprecated_func()
Base.depwarn("Don't use `deprecated_func()`!", :deprecated_func)
1 + 1
endMissing Values
Base.Missing — TypeMissingフィールドを持たない型で、そのシングルトンインスタンス missing は欠損値を表すために使用されます。
関連情報: skipmissing, nonmissingtype, Nothing.
Base.missing — ConstantBase.coalesce — Functioncoalesce(x...)引数の中で missing でない最初の値を返します。もしそのような値がなければ、missing を返します。
他にも skipmissing、something、@coalesce を参照してください。
例
julia> coalesce(missing, 1)
1
julia> coalesce(1, missing)
1
julia> coalesce(nothing, 1) # `nothing` を返します
julia> coalesce(missing, missing)
missingBase.@coalesce — Macro@coalesce(x...)coalesce のショートサーキット版です。
例
julia> f(x) = (println("f($x)"); missing);
julia> a = 1;
julia> a = @coalesce a f(2) f(3) error("`a` はまだ missing です")
1
julia> b = missing;
julia> b = @coalesce b f(2) f(3) error("`b` はまだ missing です")
f(2)
f(3)
ERROR: `b` はまだ missing です
[...]Base.ismissing — FunctionBase.skipmissing — Functionskipmissing(itr)itr内の要素を反復処理し、missing値をスキップするイテレータを返します。返されるオブジェクトは、itrがインデックス可能であれば、itrのインデックスを使用してインデックス付けできます。欠損値に対応するインデックスは無効です:それらはkeysおよびeachindexによってスキップされ、使用しようとするとMissingExceptionがスローされます。
collectを使用して、itr内の非missing値を含むArrayを取得します。itrが多次元配列であっても、入力の次元を保持しながら欠損を削除することは不可能なため、結果は常にVectorになります。
他にもcoalesce、ismissing、somethingがあります。
例
julia> x = skipmissing([1, missing, 2])
skipmissing(Union{Missing, Int64}[1, missing, 2])
julia> sum(x)
3
julia> x[1]
1
julia> x[2]
ERROR: MissingException: the value at index (2,) is missing
[...]
julia> argmax(x)
3
julia> collect(keys(x))
2-element Vector{Int64}:
1
3
julia> collect(skipmissing([1, missing, 2]))
2-element Vector{Int64}:
1
2
julia> collect(skipmissing([1 missing; 2 missing]))
2-element Vector{Int64}:
1
2Base.nonmissingtype — Functionnonmissingtype(T::Type)T が Missing を含む型の和である場合、Missing を削除した新しい型を返します。
例
julia> nonmissingtype(Union{Int64,Missing})
Int64
julia> nonmissingtype(Any)
AnySystem
Base.run — Functionrun(command, args...; wait::Bool = true)バックティックで構築されたコマンドオブジェクトを実行します(マニュアルの外部プログラムの実行セクションを参照)。プロセスが非ゼロのステータスで終了するなど、何か問題が発生した場合はエラーをスローします(waitがtrueの場合)。
args...を使用すると、コマンドにファイルディスクリプタを渡すことができ、通常のunixファイルディスクリプタ(例:stdin, stdout, stderr, FD(3), FD(4)...)のように順序付けられます。
waitがfalseの場合、プロセスは非同期で実行されます。後でそれを待機し、返されたプロセスオブジェクトでsuccessを呼び出すことでその終了ステータスを確認できます。
waitがfalseの場合、プロセスのI/Oストリームはdevnullに向けられます。waitがtrueの場合、I/Oストリームは親プロセスと共有されます。I/Oリダイレクションを制御するにはpipelineを使用してください。
Base.devnull — Constantdevnullストリームリダイレクトで使用され、書き込まれたすべてのデータを破棄します。基本的にはUnixの/dev/nullまたはWindowsのNULに相当します。使用例:
run(pipeline(`cat test.txt`, devnull))Base.success — Functionsuccess(command)バックティックで構築されたコマンドオブジェクトを実行し(マニュアルの外部プログラムの実行セクションを参照)、成功したかどうか(コード0で終了したか)を知らせます。プロセスを開始できない場合は例外が発生します。
Base.process_running — Functionprocess_running(p::Process)プロセスが現在実行中かどうかを判断します。
Base.process_exited — Functionprocess_exited(p::Process)プロセスが終了したかどうかを判断します。
Base.kill — Methodkill(p::Process, signum=Base.SIGTERM)プロセスにシグナルを送信します。デフォルトではプロセスを終了させます。プロセスがすでに終了している場合は成功を返しますが、プロセスの終了に失敗した場合(例:権限不足)にはエラーをスローします。
Base.Sys.set_process_title — FunctionSys.set_process_title(title::AbstractString)プロセスタイトルを設定します。一部のオペレーティングシステムでは無操作です。
Base.Sys.get_process_title — FunctionSys.get_process_title()プロセスタイトルを取得します。一部のシステムでは、常に空の文字列が返されます。
Base.ignorestatus — Functionignorestatus(command)コマンドオブジェクトにマークを付けて、結果コードがゼロ以外の場合でも実行時にエラーをスローしないようにします。
Base.detach — Functiondetach(command)コマンドオブジェクトにマークを付けて、新しいプロセスグループで実行されるようにし、juliaプロセスを超えて生存できるようにし、Ctrl-Cの中断がそれに渡されないようにします。
Base.Cmd — TypeCmd(cmd::Cmd; ignorestatus, detach, windows_verbatim, windows_hide, env, dir)
Cmd(exec::Vector{String})新しい Cmd オブジェクトを構築し、cmd から外部プログラムと引数を表し、オプションのキーワード引数の設定を変更します:
ignorestatus::Bool:trueの場合(デフォルトはfalse)、Cmdは戻りコードがゼロ以外の場合にエラーをスローしません。detach::Bool:trueの場合(デフォルトはfalse)、Cmdは新しいプロセスグループで実行され、juliaプロセスを超えて生存し、Ctrl-C が渡されないようになります。windows_verbatim::Bool:trueの場合(デフォルトはfalse)、Windows ではCmdが引数を引用符やエスケープなしでプロセスにコマンドライン文字列を送信します。スペースを含む引数も含まれます。(Windows では、引数は単一の「コマンドライン」文字列としてプログラムに送信され、プログラムはそれを引数に解析する責任があります。デフォルトでは、空の引数やスペースまたはタブを含む引数はコマンドラインで二重引用符"で引用され、\または"はバックスラッシュで前置されます。windows_verbatim=trueは、非標準的な方法でコマンドラインを解析するプログラムを起動するのに便利です。)非Windowsシステムには影響しません。windows_hide::Bool:trueの場合(デフォルトはfalse)、Windows ではCmdが実行されるときに新しいコンソールウィンドウは表示されません。すでにコンソールが開いている場合や非Windowsシステムでは影響しません。env:Cmdを実行する際に使用する環境変数を設定します。envは文字列を文字列にマッピングする辞書、形式"var=val"の文字列の配列、または"var"=>valペアの配列またはタプルのいずれかです。既存の環境を変更(置き換えではなく)するには、envをcopy(ENV)で初期化し、必要に応じてenv["var"]=valを設定します。すべての要素を置き換えずにCmdオブジェクト内の環境ブロックに追加するには、addenv()を使用し、更新された環境を持つCmdオブジェクトを返します。dir::AbstractString: コマンドの作業ディレクトリを指定します(現在のディレクトリの代わりに)。
指定されていないキーワードについては、cmd からの現在の設定が使用されます。
Cmd(exec) コンストラクタは exec のコピーを作成しないことに注意してください。exec に対するその後の変更は Cmd オブジェクトに反映されます。
Cmd オブジェクトを構築する最も一般的な方法は、コマンドリテラル(バックティック)を使用することです。例えば:
`ls -l`これを Cmd コンストラクタに渡して設定を変更することができます。例えば:
Cmd(`echo "Hello world"`, ignorestatus=true, detach=false)Base.setenv — Functionsetenv(command::Cmd, env; dir)指定された command を実行する際に使用する環境変数を設定します。env は、文字列を文字列にマッピングする辞書、"var=val" 形式の文字列の配列、またはゼロ個以上の "var"=>val ペア引数のいずれかです。既存の環境を置き換えるのではなく変更するには、copy(ENV) を通じて env を作成し、必要に応じて env["var"]=val を設定するか、addenv を使用します。
dir キーワード引数は、コマンドの作業ディレクトリを指定するために使用できます。dir は、指定されていない場合は command の現在設定されている dir(指定されていない場合は現在の作業ディレクトリ)にデフォルト設定されます。
Base.addenv — Functionaddenv(command::Cmd, env...; inherit::Bool = true)指定された Cmd オブジェクトに新しい環境マッピングをマージし、新しい Cmd オブジェクトを返します。重複するキーは置き換えられます。command に既に環境値が設定されていない場合、inherit が true の場合は addenv() 呼び出し時の現在の環境を継承します。値が nothing のキーは環境から削除されます。
Base.withenv — Functionwithenv(f, kv::Pair...)fを、ゼロ個以上の"var"=>val引数kvによって一時的に変更された(setenvのように置き換えられるのではなく)環境で実行します。withenvは一般的にwithenv(kv...) do ... end構文を介して使用されます。nothingの値を使用して、環境変数を一時的に解除することができます(設定されている場合)。withenvが返されると、元の環境が復元されます。
環境を変更することはスレッドセーフではありません。親プロセスとは異なる環境で外部コマンドを実行する場合は、withenvの代わりにaddenvを使用することをお勧めします。
Base.shell_escape — Functionshell_escape(args::Union{Cmd,AbstractString...}; special::AbstractString="")未エクスポートの shell_escape 関数は、未エクスポートの Base.shell_split() 関数の逆です:文字列またはコマンドオブジェクトを受け取り、特別な文字をエスケープして、Base.shell_split() を呼び出すと元のコマンドの単語の配列が返されるようにします。special キーワード引数は、空白、バックスラッシュ、引用符、ドル記号に加えて特別と見なされる文字を制御します(デフォルト:なし)。
例
julia> Base.shell_escape("cat", "/foo/bar baz", "&&", "echo", "done")
"cat '/foo/bar baz' && echo done"
julia> Base.shell_escape("echo", "this", "&&", "that")
"echo this && that"Base.shell_split — Functionshell_split(command::AbstractString)シェルコマンド文字列をその個々のコンポーネントに分割します。
例
julia> Base.shell_split("git commit -m 'Initial commit'")
4-element Vector{String}:
"git"
"commit"
"-m"
"Initial commit"Base.shell_escape_posixly — Functionshell_escape_posixly(args::Union{Cmd,AbstractString...})エクスポートされていない shell_escape_posixly 関数は、文字列またはコマンドオブジェクトを受け取り、特別な文字をエスケープして、posix シェルに引数として渡すのに安全な形式にします。
例
julia> Base.shell_escape_posixly("cat", "/foo/bar baz", "&&", "echo", "done")
"cat '/foo/bar baz' '&&' echo done"
julia> Base.shell_escape_posixly("echo", "this", "&&", "that")
"echo this '&&' that"Base.shell_escape_csh — Functionshell_escape_csh(args::Union{Cmd,AbstractString...})
shell_escape_csh(io::IO, args::Union{Cmd,AbstractString...})この関数は、文字列引数内のメタ文字を引用符で囲み、返される文字列がUnix Cシェル(csh、tcsh)によって解釈されるコマンドラインに挿入できるようにします。各文字列引数は1つの単語を形成します。
POSIXシェルとは異なり、cshは二重引用符で囲まれた文字列内でバックスラッシュを一般的なエスケープ文字として使用することをサポートしていません。したがって、この関数は、メタ文字を含む可能性のある文字列をシングルクォートで囲みますが、シングルクォートを含む部分は代わりにダブルクォートで囲みます。必要に応じて、これらの引用符のタイプを切り替えます。改行文字はバックスラッシュでエスケープされます。
この関数は、入力文字列に改行("\n")文字が含まれていない限り、POSIXシェルでも機能するはずです。
Base.shell_escape_wincmd — Functionshell_escape_wincmd(s::AbstractString)
shell_escape_wincmd(io::IO, s::AbstractString)未エクスポートの shell_escape_wincmd 関数は、Windows cmd.exe シェルのメタ文字をエスケープします。()!^<>&| をエスケープするために ^ を前に置きます。@ は文字列の先頭でのみエスケープされます。" 文字のペアとそれに囲まれた文字列はエスケープされずに通過します。残りの " は ^ でエスケープされ、結果におけるエスケープされていない " 文字の数が偶数であることが保証されます。
cmd.exe はエスケープ文字 ^ と " を処理する前に変数参照(例えば %USER%)を置き換えるため、この関数はパーセント記号 (%) をエスケープしようとはしません。入力に % が含まれていると、結果が使用される場所によっては重大な破損を引き起こす可能性があります。
エスケープできないASCII制御文字(NUL、CR、LF)を含む入力文字列は、ArgumentError 例外を引き起こします。
結果は、CMD.exe /S /C " ... "(周囲の二重引用符ペア付き)によって処理されるコマンド呼び出しの引数として安全に渡すことができ、入力に % が含まれていない場合、ターゲットアプリケーションによってそのまま受け取られます(そうでない場合、この関数は ArgumentError で失敗します)。入力文字列に % が含まれていると、コマンドインジェクションの脆弱性が生じ、cmdの引数としてこの関数の出力の適合性に関する主張が無効になる可能性があるため、さまざまなソースから文字列を組み立てる際には注意が必要です。
この関数は、プロセスパイプラインを構築する際に Cmd に対して windows_verbatim フラグと組み合わせて使用するのに役立ちます。
wincmd(c::String) =
run(Cmd(Cmd(["cmd.exe", "/s /c \" $c \""]);
windows_verbatim=true))
wincmd_echo(s::String) =
wincmd("echo " * Base.shell_escape_wincmd(s))
wincmd_echo("hello $(ENV["USERNAME"]) & the \"whole\" world! (=^I^=)")ただし、入力文字列 s に % が含まれている場合、引数リストとエコーされたテキストが破損し、任意のコマンドが実行される可能性があります。引数は環境変数として渡すこともでき、これにより % の問題と windows_verbatim フラグの必要性を回避できます:
cmdargs = Base.shell_escape_wincmd("Passing args with %cmdargs% works 100%!")
run(setenv(`cmd /C echo %cmdargs%`, "cmdargs" => cmdargs))CMDパーサー/インタープリターの特異な動作により、リテラル | 文字の後の各コマンド(コマンドパイプラインを示す)は、CMDによって2回解析されるため、shell_escape_wincmd を2回適用する必要があります。これは、ENV変数も2回展開されることを意味します!例えば:
to_print = "All for 1 & 1 for all!"
to_print_esc = Base.shell_escape_wincmd(Base.shell_escape_wincmd(to_print))
run(Cmd(Cmd(["cmd", "/S /C \" break | echo $(to_print_esc) \""]), windows_verbatim=true))I/Oストリームパラメータ io を使用すると、結果は文字列として返されるのではなく、そこに書き込まれます。
Base.escape_microsoft_c_args()、Base.shell_escape_posixly() も参照してください。
例
julia> Base.shell_escape_wincmd("a^\"^o\"^u\"")
"a^^\"^o\"^^u^\""Base.escape_microsoft_c_args — Functionescape_microsoft_c_args(args::Union{Cmd,AbstractString...})
escape_microsoft_c_args(io::IO, args::Union{Cmd,AbstractString...})コレクションの文字列引数を、多くのWindowsコマンドラインアプリケーションに渡すことができる文字列に変換します。
Microsoft Windowsは、コマンドライン全体をアプリケーションに対して単一の文字列として渡します(POSIXシステムとは異なり、シェルはコマンドラインを引数のリストに分割します)。多くのWindows APIアプリケーション(julia.exeを含む)は、Microsoft C/C++ランタイムの規則を使用して、そのコマンドラインを文字列のリストに分割します。
この関数は、これらのルールに互換性のあるパーサーの逆を実装しています。コマンドライン引数をWindows C/C++/Juliaアプリケーションに渡すために、必要に応じてメタ文字であるスペース、TAB、ダブルクォート、バックスラッシュをエスケープまたは引用しながら、コマンドラインに結合します。
また、Base.shell_escape_wincmd()、Base.escape_raw_string()も参照してください。
Base.setcpuaffinity — Functionsetcpuaffinity(original_command::Cmd, cpus) -> command::CmdcommandのCPUアフィニティをCPU IDのリスト(1ベース)cpusによって設定します。cpus = nothingを渡すと、original_commandにアフィニティが設定されている場合はそれを解除します。
この関数はLinuxとWindowsでのみサポートされています。macOSではlibuvがアフィニティ設定をサポートしていないため、サポートされていません。
例
Linuxでは、tasksetコマンドラインプログラムを使用してsetcpuaffinityの動作を確認できます。
julia> run(setcpuaffinity(`sh -c 'taskset -p $$'`, [1, 2, 5]));
pid 2273's current affinity mask: 13マスク値13は、最下位の位置から数えて最初、第二、第五ビットがオンになっていることを反映しています:
julia> 0b010011
0x13Base.pipeline — Methodpipeline(from, to, ...)データソースから宛先へのパイプラインを作成します。ソースと宛先はコマンド、I/Oストリーム、文字列、または他のpipeline呼び出しの結果であることができます。少なくとも1つの引数はコマンドでなければなりません。文字列はファイル名を指します。2つ以上の引数で呼び出すと、それらは左から右に連鎖します。例えば、pipeline(a,b,c)はpipeline(pipeline(a,b),c)と同等です。これにより、マルチステージパイプラインをより簡潔に指定する方法が提供されます。
例:
run(pipeline(`ls`, `grep xyz`))
run(pipeline(`ls`, "out.txt"))
run(pipeline("out.txt", `grep xyz`))Base.pipeline — Methodpipeline(command; stdin, stdout, stderr, append=false)指定された command へのまたはからの I/O をリダイレクトします。キーワード引数は、リダイレクトすべきコマンドのストリームを指定します。append はファイル出力がファイルに追加されるかどうかを制御します。これは、2引数の pipeline 関数のより一般的なバージョンです。pipeline(from, to) は、from がコマンドの場合は pipeline(from, stdout=to) と同等であり、from が別の種類のデータソースの場合は pipeline(to, stdin=from) と同等です。
例:
run(pipeline(`dothings`, stdout="out.txt", stderr="errs.txt"))
run(pipeline(`update`, stdout="log.txt", append=true))Base.Libc.gethostname — Functiongethostname() -> Stringローカルマシンのホスト名を取得します。
Base.Libc.getpid — Functiongetpid() -> Int32JuliaのプロセスIDを取得します。
Base.Libc.time — MethodBase.time_ns — Functiontime_ns() -> UInt64過去の特定の機械依存の任意の時間に対するナノ秒単位の時間を取得します。主な用途は、プログラム実行中の経過時間を測定することです。返される値は、システムが稼働している間は単調であることが保証されており(mod 2⁶⁴)、クロックドリフトやローカルカレンダー時間の変更の影響を受けませんが、システムの再起動やサスペンションを跨いで任意に変化する可能性があります。
(返される時間は常にナノ秒単位ですが、タイミングの解像度はプラットフォームに依存します。)
Base.@time — Macro@time expr
@time "description" expr式を実行し、その実行にかかった時間、割り当ての数、および実行によって割り当てられた合計バイト数を印刷してから、式の値を返すマクロです。ガーベジコレクション(gc)、新しいコードのコンパイル、または無効化されたコードの再コンパイルにかかった時間は、パーセンテージとして表示されます。ReentrantLock が待機しなければならなかったロックの競合は、カウントとして表示されます。
オプションで、時間レポートの前に印刷する説明文字列を提供できます。
場合によっては、システムは @time 式の内部を調べ、トップレベルの式の実行が始まる前に呼び出されたコードの一部をコンパイルします。その場合、一部のコンパイル時間はカウントされません。この時間を含めるには、@time @eval ... を実行できます。
他に @showtime、@timev、@timed、@elapsed、@allocated、および @allocations を参照してください。
julia> x = rand(10,10);
julia> @time x * x;
0.606588 秒 (2.19 M 割り当て: 116.555 MiB, 3.75% gc 時間, 99.94% コンパイル時間)
julia> @time x * x;
0.000009 秒 (1 割り当て: 896 バイト)
julia> @time begin
sleep(0.3)
1+1
end
0.301395 秒 (8 割り当て: 336 バイト)
2
julia> @time "A one second sleep" sleep(1)
A one second sleep: 1.005750 秒 (5 割り当て: 144 バイト)
julia> for loop in 1:3
@time loop sleep(1)
end
1: 1.006760 秒 (5 割り当て: 144 バイト)
2: 1.001263 秒 (5 割り当て: 144 バイト)
3: 1.003676 秒 (5 割り当て: 144 バイト)Base.@showtime — Macro@showtime expr@timeと似ていますが、参照のために評価されている式も印刷します。
関連情報として@timeを参照してください。
julia> @showtime sleep(1)
sleep(1): 1.002164 seconds (4 allocations: 128 bytes)Base.@timev — Macro@timev expr
@timev "description" exprこれは@timeマクロの詳細なバージョンです。最初に@timeと同じ情報を印刷し、その後に非ゼロのメモリ割り当てカウンタを表示し、最後に式の値を返します。
オプションで、時間レポートの前に印刷する説明文字列を提供できます。
他に@time、@timed、@elapsed、@allocated、および@allocationsを参照してください。
julia> x = rand(10,10);
julia> @timev x * x;
0.546770 seconds (2.20 M allocations: 116.632 MiB, 4.23% gc time, 99.94% compilation time)
elapsed time (ns): 546769547
gc time (ns): 23115606
bytes allocated: 122297811
pool allocs: 2197930
non-pool GC allocs:1327
malloc() calls: 36
realloc() calls: 5
GC pauses: 3
julia> @timev x * x;
0.000010 seconds (1 allocation: 896 bytes)
elapsed time (ns): 9848
bytes allocated: 896
pool allocs: 1Base.@timed — Macro@timed式を実行し、式の値、経過時間(秒)、合計バイト数、ガーベジコレクション時間、さまざまなメモリアロケーションカウンタを持つオブジェクト、コンパイル時間(秒)、および再コンパイル時間(秒)を返すマクロです。 ReentrantLock が待機しなければならなかったロックの競合は、カウントとして表示されます。
場合によっては、システムは @timed 式の内部を調べ、トップレベルの式の実行が始まる前に呼び出されたコードの一部をコンパイルします。その場合、一部のコンパイル時間はカウントされません。この時間を含めるには、@timed @eval ... を実行できます。
他にも @time、@timev、@elapsed、@allocated、@allocations、および @lock_conflicts を参照してください。
julia> stats = @timed rand(10^6);
julia> stats.time
0.006634834
julia> stats.bytes
8000256
julia> stats.gctime
0.0055765
julia> propertynames(stats.gcstats)
(:allocd, :malloc, :realloc, :poolalloc, :bigalloc, :freecall, :total_time, :pause, :full_sweep)
julia> stats.gcstats.total_time
5576500
julia> stats.compile_time
0.0
julia> stats.recompile_time
0.0
Base.@elapsed — Macro@elapsed式を評価し、結果の値を破棄し、実行にかかった秒数を浮動小数点数として返すマクロです。
場合によっては、システムは @elapsed 式の内部を調べ、トップレベルの式の実行が始まる前に呼び出されたコードの一部をコンパイルします。その場合、いくつかのコンパイル時間はカウントされません。この時間を含めるには、@elapsed @eval ... を実行できます。
他に @time、@timev、@timed、@allocated、および @allocations も参照してください。
julia> @elapsed sleep(0.3)
0.301391426Base.@allocated — Macro@allocated式を評価し、結果の値を破棄して、式の評価中に割り当てられた合計バイト数を返すマクロです。
式が関数呼び出しである場合、引数式からの割り当てのみを測定し、関数の呼び出しに伴うオーバーヘッドや提供された引数値での定数伝播を除外するように努めます。それらの影響を含めたい場合、つまり呼び出し元も測定したい場合は、構文 @allocated (()->f(1))() を使用してください。
関数呼び出しは、単純な引数式のみで測定することをお勧めします。例えば、x = []; @allocated f(x) のように、@allocated f([]) の代わりに使用して、測定されるのは f のみであることを明確にします。
より複雑な式の場合、コードはそのまま実行されるため、周囲のコンテキストによる割り当てが発生する可能性があります。例えば、@allocated f(1) と @allocated x = f(1) が異なる結果を返すことがあります。
他にも @allocations、@time、@timev、@timed、および @elapsed を参照してください。
julia> @allocated rand(10^6)
8000080Base.@allocations — Macro@allocations式を評価し、結果の値を破棄し、代わりに式の評価中に行われた合計のアロケーション数を返すマクロです。
他にも @allocated、@time、@timev、@timed、および @elapsed を参照してください。
julia> @allocations rand(10^6)
2Base.@lock_conflicts — Macro@lock_conflicts式を評価し、結果の値を破棄し、代わりに評価中のロック競合の総数を返すマクロであり、ReentrantLock に対するロック試行が、ロックがすでに保持されているために待機を引き起こした場合に該当します。
他に @time、@timev、および @timed も参照してください。
julia> @lock_conflicts begin
l = ReentrantLock()
Threads.@threads for i in 1:Threads.nthreads()
lock(l) do
sleep(1)
end
end
end
5Base.EnvDict — TypeEnvDict() -> EnvDictこの型のシングルトンは、環境変数へのハッシュテーブルインターフェースを提供します。
Base.ENV — ConstantENVシングルトン EnvDict への参照で、システム環境変数に対する辞書インターフェースを提供します。
(Windowsでは、システム環境変数は大文字と小文字を区別しないため、ENV はすべてのキーを表示、反復、コピーのために大文字に変換します。ポータブルなコードは、変数を大文字と小文字で区別できる能力に依存すべきではなく、表面的に小文字の変数を設定すると大文字の ENV キーになる可能性があることに注意する必要があります。)
例
julia> ENV
Base.EnvDict with "50" entries:
"SECURITYSESSIONID" => "123"
"USER" => "username"
"MallocNanoZone" => "0"
⋮ => ⋮
julia> ENV["JULIA_EDITOR"] = "vim"
"vim"
julia> ENV["JULIA_EDITOR"]
"vim"Base.Sys.STDLIB — ConstantSys.STDLIB::Stringstdlib パッケージを含むディレクトリへのフルパスを含む文字列。
Base.Sys.isunix — FunctionSys.isunix([os])OSがUnixライクなインターフェースを提供しているかどうかをテストするための述語です。Handling Operating System Variationのドキュメントを参照してください。
Base.Sys.isapple — FunctionSys.isapple([os])OSがApple Macintosh OS XまたはDarwinの派生であるかどうかをテストするための述語。詳細はHandling Operating System Variationを参照してください。
Base.Sys.islinux — FunctionSys.islinux([os])OSがLinuxの派生であるかどうかをテストするための述語です。Handling Operating System Variationのドキュメントを参照してください。
Base.Sys.isbsd — FunctionSys.isbsd([os])OSがBSDの派生であるかどうかをテストするための述語。詳細はHandling Operating System Variationのドキュメントを参照してください。
Base.Sys.isfreebsd — FunctionSys.isfreebsd([os])FreeBSDの派生であるかどうかをテストするための述語。詳細はHandling Operating System Variationのドキュメントを参照してください。
Base.Sys.isopenbsd — FunctionSys.isopenbsd([os])OpenBSDの派生であるかどうかをテストするための述語。詳細はHandling Operating System Variationのドキュメントを参照してください。
Base.Sys.isnetbsd — FunctionSys.isnetbsd([os])NetBSDの派生であるかどうかをテストするための述語。詳細はHandling Operating System Variationのドキュメントを参照してください。
Base.Sys.isdragonfly — FunctionSys.isdragonfly([os])OSがDragonFly BSDの派生であるかどうかをテストするための述語です。Operating System Variationの取り扱いのドキュメントを参照してください。
Base.Sys.iswindows — FunctionSys.iswindows([os])Microsoft Windows NT の派生であるかどうかをテストするための述語。詳細は Handling Operating System Variation を参照してください。
Base.Sys.windows_version — FunctionSys.windows_version()Windows NTカーネルのバージョン番号をVersionNumberとして返します。つまり、v"major.minor.build"の形式で、Windows上で実行されていない場合はv"0.0.0"を返します。
Base.Sys.free_memory — FunctionSys.free_memory()RAMの合計空きメモリをバイト単位で取得します。
Base.Sys.total_memory — FunctionSys.total_memory()RAMの合計メモリ(現在使用中のものを含む)をバイト単位で取得します。この量は、Linuxコントロールグループなどによって制約される場合があります。制約のない量については、Sys.total_physical_memory()を参照してください。
Base.Sys.free_physical_memory — FunctionSys.free_physical_memory()システムの空きメモリをバイト単位で取得します。全体の量が現在のプロセスに利用可能であるとは限りません; 実際に利用可能な量については Sys.free_memory() を使用してください。
Base.Sys.total_physical_memory — FunctionSys.total_physical_memory()RAMの合計メモリ(現在使用中のものを含む)をバイト単位で取得します。全体の量が現在のプロセスに利用可能であるとは限りません; Sys.total_memory()を参照してください。
Base.Sys.uptime — FunctionSys.uptime()現在のシステムの稼働時間を秒単位で取得します。
Base.Sys.isjsvm — FunctionSys.isjsvm([os])JuliaがJavaScript VM(JSVM)で実行されているかどうかをテストするための述語。例えば、ウェブブラウザ内のWebAssembly JavaScript埋め込みを含みます。
Base.Sys.loadavg — FunctionSys.loadavg()負荷平均を取得します。参照: https://en.wikipedia.org/wiki/Load_(computing).
Base.Sys.isexecutable — Functionisexecutable(path::String)指定された path に実行権限がある場合は true を返します。
この権限はユーザーが path を実行する前に変更される可能性があるため、最初に isexecutable を呼び出すのではなく、ファイルを実行して失敗した場合にエラーを処理することをお勧めします。
Julia 1.6 より前は、Windows のファイルシステム ACL を正しく調査していなかったため、任意のファイルに対して true を返していました。Julia 1.6 以降は、ファイルが実行可能としてマークされているかどうかを正しく判断します。
関連情報として ispath、isreadable、iswritable を参照してください。
Base.Sys.isreadable — Functionisreadable(path::String)与えられた path のアクセス権が現在のユーザーによる読み取りを許可している場合は true を返します。
この権限はユーザーが open を呼び出す前に変更される可能性があるため、最初に isreadable を呼び出すのではなく、単に open を呼び出して、失敗した場合にエラーを処理することをお勧めします。
関連情報として ispath, isexecutable, iswritable を参照してください。
isreadable(io) -> Bool指定された IO オブジェクトが読み取り可能でない場合は false を返します。
例
julia> open("myfile.txt", "w") do io
print(io, "Hello world!");
isreadable(io)
end
false
julia> open("myfile.txt", "r") do io
isreadable(io)
end
true
julia> rm("myfile.txt")Base.Sys.iswritable — Functioniswritable(path::String)与えられた path のアクセス権が現在のユーザーによる書き込みを許可している場合は true を返します。
この権限はユーザーが open を呼び出す前に変更される可能性があるため、最初に iswritable を呼び出すのではなく、単独で open を呼び出し、失敗した場合にエラーを処理することをお勧めします。
関連情報として ispath、isexecutable、isreadable を参照してください。
iswritable(io) -> Bool指定されたIOオブジェクトが書き込み可能でない場合はfalseを返します。
例
julia> open("myfile.txt", "w") do io
print(io, "Hello world!");
iswritable(io)
end
true
julia> open("myfile.txt", "r") do io
iswritable(io)
end
false
julia> rm("myfile.txt")Base.Sys.username — FunctionSys.username() -> String現在のユーザーのユーザー名を返します。ユーザー名を特定できない場合や空の場合、この関数はエラーをスローします。
環境変数を介して上書き可能なユーザー名を取得するには、例えば USER を使用して、次のように考慮してください。
user = get(Sys.username, ENV, "USER")関連情報は homedir を参照してください。
Base.@static — Macro@staticマクロ展開時に式を部分的に評価します。
これは、ccallのように、特定のケースで無効になる構造がある場合や、インポートされていないパッケージで定義されたマクロの場合に便利です。
@staticは条件を必要とします。条件はif文、三項演算子、または&&、||のいずれかであることができます。条件は、マクロを再帰的に展開し、結果の式を下げて実行することによって評価されます。その後、一致するブランチ(あれば)が返されます。条件の他のすべてのブランチは、マクロ展開される前に削除されます(そして下げられたり実行されたりします)。
例
macOSでのみ有効な式exprを解析したいとします。この問題は、@staticを使って@static if Sys.isapple() expr endで解決できます。macOS用のexpr_appleと他のオペレーティングシステム用のexpr_othersがある場合、@staticを使った解決策は@static Sys.isapple() ? expr_apple : expr_othersになります。
Versioning
Base.VersionNumber — TypeVersionNumberバージョン番号タイプで、セマンティックバージョニング (semver) の仕様に従い、メジャー、マイナー、パッチの数値値で構成され、プレリリースおよびビルドのアルファベット注釈が続きます。
VersionNumber オブジェクトは、すべての標準比較演算子(==, <, <= など)で比較でき、その結果は semver v2.0.0-rc.2 ルールに従います。
VersionNumber には以下の公開フィールドがあります:
v.major::Integerv.minor::Integerv.patch::Integerv.prerelease::Tuple{Vararg{Union{Integer, AbstractString}}}v.build::Tuple{Vararg{Union{Integer, AbstractString}}}
効率的に VersionNumber オブジェクトを semver 形式のリテラル文字列から構築するための @v_str、Julia 自体の VersionNumber のための VERSION、およびマニュアルの Version Number Literals も参照してください。
例
julia> a = VersionNumber(1, 2, 3)
v"1.2.3"
julia> a >= v"1.2"
true
julia> b = VersionNumber("2.0.1-rc1")
v"2.0.1-rc1"
julia> b >= v"2.0.1"
falseBase.@v_str — Macro@v_str文字列をVersionNumberに解析するために使用される文字列マクロ。
例
julia> v"1.2.3"
v"1.2.3"
julia> v"2.0.1-rc1"
v"2.0.1-rc1"Errors
Base.error — Functionerror(msg...)string(msg...)によって構築されたメッセージを持つErrorExceptionを発生させます。
error(message::AbstractString)指定されたメッセージでErrorExceptionを発生させます。
Core.throw — FunctionBase.rethrow — Functionrethrow()catch ブロック内から現在の例外を再スローします。再スローされた例外は、捕捉されなかったかのように伝播を続けます。
代替形式 rethrow(e) は、現在のバックトレースに代替の例外オブジェクト e を関連付けることを可能にします。しかし、これはエラー発生時のプログラムの状態を誤って表現するため、代わりに throw(e) を使用して新しい例外をスローすることをお勧めします。Julia 1.1 以降では、throw(e) を使用すると、スタック上の根本的な原因の例外が保持されることが説明されています current_exceptions。
Base.backtrace — Functionbacktrace()現在のプログラムポイントのバックトレースオブジェクトを取得します。
Base.catch_backtrace — Functioncatch_backtrace()現在の例外のバックトレースを取得し、catch ブロック内で使用します。
Base.current_exceptions — Functioncurrent_exceptions(task::Task=current_task(); [backtrace::Bool=true])現在処理中の例外のスタックを取得します。ネストされたキャッチブロックがある場合、現在の例外が複数存在する可能性があり、その場合、最も最近スローされた例外がスタックの最後にあります。スタックは ExceptionStack として返され、これは名前付きタプル (exception,backtrace) の AbstractVector です。backtrace が false の場合、各ペアのバックトレースは nothing に設定されます。
task を明示的に渡すことで、任意のタスクの現在の例外スタックを返します。これは、未処理の例外によって失敗したタスクを調査するのに便利です。
Base.@assert — Macro@assert cond [text]condがfalseの場合、AssertionErrorをスローします。これは、ユーザーが失敗した場合のデバッグの助けとして、真であると仮定される条件をチェックするために使用することができるアサーションを書くための推奨構文です。オプションのメッセージtextは、アサーションの失敗時に表示されます。
アサートは、いくつかの最適化レベルで無効にされる可能性があります。したがって、アサートはデバッグツールとしてのみ使用され、認証検証(例:パスワードの検証や配列の境界のチェック)には使用すべきではありません。コードは、関数の正しい動作のためにcondの副作用に依存してはなりません。
例
julia> @assert iseven(3) "3は奇数です!"
ERROR: AssertionError: 3は奇数です!
julia> @assert isodd(3) "偶数とは何ですか?"Base.Experimental.register_error_hint — FunctionExperimental.register_error_hint(handler, exceptiontype)「ヒント」関数 handler(io, exception) を登録し、ユーザーがエラーを回避するための潜在的な方法を提案できるようにします。 handler は exception を調べて、ヒントに適した条件が満たされているかどうかを確認し、そうであれば io に出力を生成します。パッケージは __init__ 関数内から register_error_hint を呼び出すべきです。
特定の例外タイプに対して、handler は追加の引数を受け取る必要があります:
MethodError:handler(io, exc::MethodError, argtypes, kwargs)を提供し、結合された引数を位置引数とキーワード引数に分割します。
ヒントを発行する際、出力は通常 \n で始まるべきです。
カスタム例外タイプを定義する場合、showerror メソッドは Experimental.show_error_hints を呼び出すことでヒントをサポートできます。
例
julia> module Hinter
only_int(x::Int) = 1
any_number(x::Number) = 2
function __init__()
Base.Experimental.register_error_hint(MethodError) do io, exc, argtypes, kwargs
if exc.f == only_int
# 色は必要ありません、これは可能であることを示すためだけです。
print(io, "\n呼び出そうとしましたか ")
printstyled(io, "`any_number`?", color=:cyan)
end
end
end
endその後、Hinter.only_int を Int でないものに呼び出すと(これにより MethodError が発生します)、ヒントが発行されます:
julia> Hinter.only_int(1.0)
ERROR: MethodError: no method matching only_int(::Float64)
関数 `only_int` は存在しますが、この引数タイプの組み合わせに対して定義されたメソッドはありません。
`any_number` を呼び出そうとしましたか?
最も近い候補は:
...Base.Experimental.show_error_hints — FunctionExperimental.show_error_hints(io, ex, args...)特定の例外タイプ typeof(ex) に対して Experimental.register_error_hint からすべてのハンドラーを呼び出します。 args には、そのタイプのハンドラーが期待する他の引数を含める必要があります。
Core.ArgumentError — TypeArgumentError(msg)関数に渡された引数が無効です。msgは説明的なエラーメッセージです。
Core.AssertionError — TypeAssertionError([msg])主張された条件が true に評価されませんでした。オプションの引数 msg は、説明的なエラーストリングです。
例
julia> @assert false "this is not true"
ERROR: AssertionError: this is not trueAssertionError は通常 @assert からスローされます。
Core.BoundsError — TypeBoundsError([a],[i])配列 a へのインデックス操作が、インデックス i で範囲外の要素にアクセスしようとしました。
例
julia> A = fill(1.0, 7);
julia> A[8]
ERROR: BoundsError: attempt to access 7-element Vector{Float64} at index [8]
julia> B = fill(1.0, (2,3));
julia> B[2, 4]
ERROR: BoundsError: attempt to access 2×3 Matrix{Float64} at index [2, 4]
julia> B[9]
ERROR: BoundsError: attempt to access 2×3 Matrix{Float64} at index [9]
Base.CompositeException — TypeCompositeExceptionTask(@ref)によってスローされた例外のVectorをラップし(例えば、チャネルを介してリモートワーカーから生成されたものや、非同期に実行されるローカルI/O書き込み、またはpmapの下でのリモートワーカーからのもの)、例外の系列に関する情報を提供します。例えば、複数のワーカーがいくつかのタスクを実行していて、複数のワーカーが失敗した場合、結果として得られるCompositeExceptionは、各ワーカーからの情報の「バンドル」を含み、例外が発生した場所と理由を示します。
Base.DimensionMismatch — TypeDimensionMismatch([msg])呼び出されたオブジェクトは、次元が一致していません。オプションの引数 msg は、説明的なエラーストリングです。
Core.DivideError — TypeDivideError()整数除算が0の分母値で試みられました。
例
julia> 2/0
Inf
julia> div(2, 0)
ERROR: DivideError: 整数除算エラー
Stacktrace:
[...]Core.DomainError — TypeDomainError(val)
DomainError(val, msg)関数またはコンストラクタへの引数 val が有効なドメインの外にあります。
例
julia> sqrt(-1)
ERROR: DomainError with -1.0:
sqrtは負の実引数で呼び出されましたが、複素引数で呼び出された場合にのみ複素結果を返します。sqrt(Complex(x))を試してください。
Stacktrace:
[...]Base.EOFError — TypeEOFError()ファイルまたはストリームから読み取るためのデータがもうありませんでした。
Core.ErrorException — TypeErrorException(msg)一般的なエラータイプです。エラーメッセージは、.msg フィールドにあり、より具体的な詳細を提供する場合があります。
例
julia> ex = ErrorException("I've done a bad thing");
julia> ex.msg
"I've done a bad thing"Core.FieldError — TypeFieldError(type::DataType, field::Symbol)操作が type のオブジェクトに対して無効な field にアクセスしようとしました。
Julia 1.12 より前は、無効なフィールドアクセスは ErrorException をスローしました。
getfield を参照してください。
例
julia> struct AB
a::Float32
b::Float64
end
julia> ab = AB(1, 3)
AB(1.0f0, 3.0)
julia> ab.c # フィールド `c` は存在しません
ERROR: FieldError: type AB has no field `c`, available fields: `a`, `b`
Stacktrace:
[...]Core.InexactError — TypeInexactError(name::Symbol, T, val)valを関数nameのメソッド内で型Tに正確に変換できません。
例
julia> convert(Float64, 1+2im)
ERROR: InexactError: Float64(1 + 2im)
Stacktrace:
[...]Core.InterruptException — TypeInterruptException()プロセスはターミナルの中断(CTRL+C)によって停止されました。
-i(インタラクティブ)オプションなしで開始されたJuliaスクリプトでは、InterruptExceptionはデフォルトではスローされないことに注意してください。スクリプト内でBase.exit_on_sigint(false)を呼び出すことで、REPLの動作を回復できます。あるいは、次のようにJuliaスクリプトを開始することもできます。
julia -e "include(popfirst!(ARGS))" script.jlこれにより、実行中にCTRL+CによってInterruptExceptionがスローされるようになります。
Base.KeyError — TypeKeyError(key)AbstractDict(Dict)やSetのようなオブジェクトへのインデックス操作が存在しない要素にアクセスまたは削除しようとしました。
Core.LoadError — TypeLoadError(file::AbstractString, line::Int, error)ファイルをincludeしたり、requireしたり、usingしたりする際にエラーが発生しました。エラーの詳細は.errorフィールドにあります。
Core.MethodError — TypeMethodError(f, args)要求される型シグネチャを持つメソッドが、指定された汎用関数に存在しません。あるいは、ユニークな最も特定的なメソッドが存在しません。
Base.MissingException — TypeMissingException(msg)missing 値がサポートされていない状況で遭遇したときにスローされる例外。msg フィールドのエラーメッセージには、より具体的な詳細が含まれている場合があります。
Core.OutOfMemoryError — TypeOutOfMemoryError()操作がシステムまたはガベージコレクタが適切に処理できるメモリを超えて割り当てました。
Core.ReadOnlyMemoryError — TypeReadOnlyMemoryError()操作が読み取り専用のメモリに書き込もうとしました。
Core.OverflowError — TypeOverflowError(msg)式の結果が指定された型に対して大きすぎて、ラップアラウンドを引き起こします。
Base.ProcessFailedException — TypeProcessFailedExceptionプロセスの問題のある終了ステータスを示します。コマンドやパイプラインを実行しているとき、これは非ゼロの終了コードが返されたことを示すためにスローされます(つまり、呼び出されたプロセスが失敗したことを示します)。
Base.TaskFailedException — TypeTaskFailedExceptionこの例外は、タスク t が失敗したときに wait(t) 呼び出しによってスローされます。TaskFailedException は失敗したタスク t をラップします。
Core.StackOverflowError — TypeStackOverflowError()関数呼び出しがコールスタックのサイズを超えました。これは通常、呼び出しが無限に再帰する場合に発生します。
Base.SystemError — TypeSystemError(prefix::AbstractString, [errno::Int32])システムコールがエラーコード(errno グローバル変数内)で失敗しました。
Core.TypeError — TypeTypeError(func::Symbol, context::AbstractString, expected::Type, got)型アサーションの失敗、または不正な引数型で内蔵関数を呼び出したことを示します。
Core.UndefKeywordError — TypeUndefKeywordError(var::Symbol)必要なキーワード引数 var が関数呼び出しで割り当てられていません。
例
julia> function my_func(;my_arg)
return my_arg + 1
end
my_func (generic function with 1 method)
julia> my_func()
ERROR: UndefKeywordError: keyword argument `my_arg` not assigned
Stacktrace:
[1] my_func() at ./REPL[1]:2
[2] top-level scope at REPL[2]:1Core.UndefRefError — TypeUndefRefError()指定されたオブジェクトに対してアイテムまたはフィールドが定義されていません。
例
julia> struct MyType
a::Vector{Int}
MyType() = new()
end
julia> A = MyType()
MyType(#undef)
julia> A.a
ERROR: UndefRefError: access to undefined reference
Stacktrace:
[...]Core.UndefVarError — TypeUndefVarError(var::Symbol, [scope])現在のスコープにシンボルが定義されていません。
例
julia> a
ERROR: UndefVarError: `a` not defined in `Main`
julia> a = 1;
julia> a
1Base.StringIndexError — TypeStringIndexError(str, i)iが無効なインデックスであるため、strにアクセスしようとしたときにエラーが発生しました。
Core.InitError — TypeInitError(mod::Symbol, error)モジュールの __init__ 関数を実行中にエラーが発生しました。実際にスローされたエラーは .error フィールドで確認できます。
Base.retry — Functionretry(f; delays=ExponentialBackOff(), check=nothing) -> Function関数 f を呼び出す無名関数を返します。例外が発生した場合、check が true を返すたびに、delays で指定された秒数待った後に f が繰り返し呼び出されます。check は delays の現在の状態と Exception を入力する必要があります。
例
retry(f, delays=fill(5.0, 3))
retry(f, delays=rand(5:10, 2))
retry(f, delays=Base.ExponentialBackOff(n=3, first_delay=5, max_delay=1000))
retry(http_get, check=(s,e)->e.status == "503")(url)
retry(read, check=(s,e)->isa(e, IOError))(io, 128; all=false)Base.ExponentialBackOff — TypeExponentialBackOff(; n=1, first_delay=0.05, max_delay=10.0, factor=5.0, jitter=0.1)長さ n の Float64 イテレータで、その要素は factor * (1 ± jitter) の範囲で指数的に増加します。最初の要素は first_delay で、すべての要素は max_delay に制限されます。
Events
Base.Timer — MethodTimer(callback::Function, delay; interval = 0, spawn::Union{Nothing,Bool}=nothing)関数 callback を各タイマーの期限切れ時に実行するタイマーを作成します。
待機中のタスクは起こされ、関数 callback は最初の遅延 delay 秒後に呼び出され、その後は指定された interval 秒ごとに繰り返し呼び出されます。interval が 0 の場合、コールバックは一度だけ実行されます。関数 callback は、タイマー自体を引数として一つ受け取ります。タイマーを停止するには close を呼び出します。タイマーがすでに期限切れの場合、コールバックは最後に一度実行されることがあります。
spawn が true の場合、作成されたタスクはスピンオフされ、スレッドを移動できるようになり、親タスクが現在のスレッドに固定されるという副作用を回避します。spawn が nothing(デフォルト)の場合、親タスクがスティッキーでない限り、タスクはスピンオフされます。
例
ここでは、最初の数字が2秒の遅延の後に印刷され、その後の数字はすぐに印刷されます。
julia> begin
i = 0
cb(timer) = (global i += 1; println(i))
t = Timer(cb, 2, interval=0.2)
wait(t)
sleep(0.5)
close(t)
end
1
2
3Base.Timer — TypeTimer(delay; interval = 0)タイマーを作成し、タスクがそれを待機している場合(タイマーオブジェクトでwaitを呼び出すことによって)起こします。
待機中のタスクは、最初の遅延が少なくともdelay秒経過した後に起こされ、その後は少なくともinterval秒が経過するごとに繰り返し起こされます。intervalが0に等しい場合、タイマーは一度だけトリガーされます。タイマーが閉じられると(closeによって)待機中のタスクはエラーで起こされます。タイマーがまだアクティブかどうかを確認するにはisopenを使用します。t.timeoutおよびt.intervalを使用して、Timer tの設定条件を読み取ります。
julia> t = Timer(1.0; interval=0.5)
Timer (open, timeout: 1.0 s, interval: 0.5 s) @0x000000010f4e6e90
julia> isopen(t)
true
julia> t.timeout
1.0
julia> close(t)
julia> isopen(t)
false!!! compat "Julia 1.12 timeoutおよびintervalの読み取り可能なプロパティはJulia 1.12で追加されました。
Base.AsyncCondition — TypeAsyncCondition()非同期条件を作成し、Cからのuv_async_sendの呼び出しによって通知されたときに、それを待機しているタスク(オブジェクト上でwaitを呼び出すことによって)を起こします。オブジェクトが閉じられたとき(closeによって)、待機しているタスクはエラーで起こされます。まだアクティブかどうかを確認するには、isopenを使用してください。
これにより、送信スレッドと待機スレッド間で暗黙の取得と解放のメモリ順序が提供されます。
Base.AsyncCondition — MethodAsyncCondition(callback::Function)指定された callback 関数を呼び出す非同期条件を作成します。 callback には1つの引数、非同期条件オブジェクト自体が渡されます。
Reflection
Base.nameof — MethodBase.parentmodule — Functionparentmodule(m::Method) -> Module指定されたメソッド m が定義されているモジュールを返します。
parentmodule(f::Function, types) -> Module指定された types に一致する汎用関数 f の最初のメソッドを含むモジュールを決定します。
parentmodule(f::Function) -> Module汎用関数の(最初の)定義を含むモジュールを特定します。
parentmodule(t::DataType) -> Module定義を含むモジュールを決定します(潜在的に UnionAll でラップされた)DataType。
例
julia> module Foo
struct Int end
end
Foo
julia> parentmodule(Int)
Core
julia> parentmodule(Foo.Int)
Fooparentmodule(m::Module) -> Moduleモジュールの囲む Module を取得します。Main は自分自身の親です。
参照: names, nameof, fullname, @__MODULE__.
例
julia> parentmodule(Main)
Main
julia> parentmodule(Base.Broadcast)
BaseBase.pathof — Methodpathof(m::Module)モジュール m を import するために使用された m.jl ファイルのパスを返します。モジュール m がパッケージからインポートされていない場合は nothing を返します。
パスのディレクトリ部分を取得するには dirname を、ファイル名部分を取得するには basename を使用してください。
さらに pkgdir も参照してください。
Base.pkgdir — Methodpkgdir(m::Module[, paths::String...])モジュール m を宣言したパッケージのルートディレクトリを返します。m がパッケージ内で宣言されていない場合は nothing を返します。オプションで、パッケージのルート内のパスを構成するために、さらにパスコンポーネントの文字列を提供できます。
現在のモジュールを実装しているパッケージのルートディレクトリを取得するには、pkgdir(@__MODULE__) の形式を使用できます。
拡張モジュールが指定された場合は、親パッケージのルートが返されます。
julia> pkgdir(Foo)
"/path/to/Foo.jl"
julia> pkgdir(Foo, "src", "file.jl")
"/path/to/Foo.jl/src/file.jl"他にも pathof を参照してください。
Base.pkgversion — Methodpkgversion(m::Module)モジュール m をインポートしたパッケージのバージョンを返します。m がパッケージからインポートされていない場合、またはバージョンフィールドが設定されていないパッケージからインポートされた場合は nothing を返します。
バージョンはパッケージの Project.toml からパッケージのロード時に読み取られます。
現在のモジュールをインポートしたパッケージのバージョンを取得するには、pkgversion(@__MODULE__) の形式を使用できます。
Base.moduleroot — Functionmoduleroot(m::Module) -> Module与えられたモジュールのルートモジュールを見つけます。これは、mの親モジュールのチェーンの中で、登録されたルートモジュールであるか、自身が親モジュールである最初のモジュールです。
__module__ — Keyword__module__引数 __module__ はマクロ内でのみ可視であり、マクロ呼び出しの展開コンテキストに関する情報(Module オブジェクトの形式で)を提供します。詳細については、マクロ呼び出し に関するマニュアルのセクションを参照してください。
__source__ — Keyword__source__引数 __source__ はマクロ内でのみ可視であり、マクロ呼び出しからの @ 記号のパーサー位置に関する情報(LineNumberNode オブジェクトの形式で)を提供します。詳細については、マクロ呼び出し に関するマニュアルのセクションを参照してください。
Base.@__MODULE__ — Macro@__MODULE__ -> モジュール現在読み込まれているコードの モジュール を取得します。これはトップレベルの eval の モジュール です。
Base.@__FILE__ — Macro@__FILE__ -> Stringマクロ呼び出しを含むファイルへのパスを持つ文字列に展開します。julia -e <expr> で評価された場合は空の文字列を返します。マクロがパーサーソース情報を欠いている場合は nothing を返します。代わりに PROGRAM_FILE を参照してください。
Base.@__DIR__ — Macro@__DIR__ -> String現在のディレクトリの絶対パスを文字列として取得するためのマクロです。
スクリプト内で使用される場合、@__DIR__マクロ呼び出しを含むスクリプトのディレクトリを返します。REPLから実行するか、julia -e <expr>で評価されると、現在の作業ディレクトリを返します。
例
この例では、@__DIR__とpwd()の動作の違いを示すために、現在の作業ディレクトリとは異なるディレクトリにシンプルなスクリプトを作成し、両方のコマンドを実行します:
julia> cd("/home/JuliaUser") # 作業ディレクトリ
julia> # /home/JuliaUser/Projectsにスクリプトを作成
open("/home/JuliaUser/Projects/test.jl","w") do io
print(io, """
println("@__DIR__ = ", @__DIR__)
println("pwd() = ", pwd())
""")
end
julia> # スクリプトのディレクトリと現在の作業ディレクトリを出力
include("/home/JuliaUser/Projects/test.jl")
@__DIR__ = /home/JuliaUser/Projects
pwd() = /home/JuliaUserBase.@__LINE__ — Macro@__LINE__ -> Intマクロ呼び出しの位置の行番号に展開されます。行番号が特定できない場合は 0 を返します。
Base.fullname — Functionfullname(m::Module)モジュールの完全修飾名をシンボルのタプルとして取得します。例えば、
例
julia> fullname(Base.Iterators)
(:Base, :Iterators)
julia> fullname(Main)
(:Main,)Base.names — Functionnames(x::Module; all::Bool=false, imported::Bool=false, usings::Bool=false) -> Vector{Symbol}モジュールの公開名のベクターを取得します。非推奨の名前は除外されます。all が true の場合、リストにはモジュール内で定義された非公開名、非推奨名、およびコンパイラ生成名も含まれます。imported が true の場合、他のモジュールから明示的にインポートされた名前も含まれます。usings が true の場合、using を介して明示的にインポートされた名前も含まれます。名前はソートされた順序で返されます。
特別なケースとして、Main に定義されたすべての名前は「公開」と見なされます。なぜなら、Main の名前を明示的に公開としてマークすることは慣習的ではないからです。
sym ∈ names(SomeModule) は isdefined(SomeModule, sym) を意味しません。names は、モジュール内で定義されていなくても、public または export とマークされたシンボルを返すことがあります。
参照: Base.isexported, Base.ispublic, Base.@locals, @__MODULE__.
Base.isexported — Functionisexported(m::Module, s::Symbol) -> Boolモジュールからシンボルがエクスポートされているかどうかを返します。
julia> module Mod
export foo
public bar
end
Mod
julia> Base.isexported(Mod, :foo)
true
julia> Base.isexported(Mod, :bar)
false
julia> Base.isexported(Mod, :baz)
falseBase.ispublic — Functionispublic(m::Module, s::Symbol) -> Boolモジュール内でシンボルが公開されているかどうかを返します。
エクスポートされたシンボルは公開と見なされます。
関連情報: isexported, names
julia> module Mod
export foo
public bar
end
Mod
julia> Base.ispublic(Mod, :foo)
true
julia> Base.ispublic(Mod, :bar)
true
julia> Base.ispublic(Mod, :baz)
falseBase.nameof — Methodnameof(f::Function) -> Symbol汎用 Function の名前をシンボルとして取得します。匿名関数の場合、これはコンパイラ生成の名前です。Function の明示的に宣言されたサブタイプの場合、それは関数の型の名前です。
Base.functionloc — Methodfunctionloc(f::Function, types)汎用 Function 定義の位置を示すタプル (filename,line) を返します。
Base.functionloc — Methodfunctionloc(m::Method)Method 定義の場所を示すタプル (filename,line) を返します。
Base.@locals — Macro@locals()呼び出し元の時点で定義されているすべてのローカル変数の名前(シンボルとして)と値の辞書を構築します。
例
julia> let x = 1, y = 2
Base.@locals
end
Dict{Symbol, Any} with 2 entries:
:y => 2
:x => 1
julia> function f(x)
local y
show(Base.@locals); println()
for i = 1:1
show(Base.@locals); println()
end
y = 2
show(Base.@locals); println()
nothing
end;
julia> f(42)
Dict{Symbol, Any}(:x => 42)
Dict{Symbol, Any}(:i => 1, :x => 42)
Dict{Symbol, Any}(:y => 2, :x => 42)Core.getglobal — Functiongetglobal(module::Module, name::Symbol, [order::Symbol=:monotonic])モジュール module からバインディング name の値を取得します。オプションで、操作のための原子的な順序を定義できます。そうでなければ、デフォルトは単調です。
getfield を使用してモジュールのバインディングにアクセスすることは互換性を維持するためにまだサポートされていますが、getglobal を使用することが常に推奨されます。なぜなら、getglobal は原子的な順序を制御できるため(getfield は常に単調です)、ユーザーやコンパイラに対してコードの意図をより明確に示すことができるからです。
ほとんどのユーザーはこの関数を直接呼び出す必要はありません – getproperty 関数または対応する構文(すなわち module.name)が、非常に特定の使用例を除いて推奨されます。
他に getproperty と setglobal! も参照してください。
例
julia> a = 1
1
julia> module M
a = 2
end;
julia> getglobal(@__MODULE__, :a)
1
julia> getglobal(M, :a)
2Core.setglobal! — Functionsetglobal!(module::Module, name::Symbol, x, [order::Symbol=:monotonic])モジュール module 内のバインディング name の値を x に設定または変更します。型変換は行われないため、バインディングに対してすでに型が宣言されている場合、x は適切な型でなければならず、そうでない場合はエラーがスローされます。
さらに、この操作のために原子的な順序を指定することができ、指定しない場合はデフォルトで単調になります。
ユーザーは通常、この機能に setproperty! 関数または対応する構文(すなわち module.name = x)を通じてアクセスするため、これは非常に特定のユースケースのために意図されています。
他にも setproperty! と getglobal を参照してください。
例
julia> module M; global a; end;
julia> M.a # `getglobal(M, :a)` と同じ
ERROR: UndefVarError: `a` not defined in `M`
Suggestion: add an appropriate import or assignment. This global was declared but not assigned.
Stacktrace:
[1] getproperty(x::Module, f::Symbol)
@ Base ./Base_compiler.jl:40
[2] top-level scope
@ none:1
julia> setglobal!(M, :a, 1)
1
julia> M.a
1Core.modifyglobal! — Functionmodifyglobal!(module::Module, name::Symbol, op, x, [order::Symbol=:monotonic]) -> Pairアトミックに操作を実行して、関数 op を適用した後にグローバルを取得して設定します。
他に modifyproperty! と setglobal! を参照してください。
Core.swapglobal! — Functionswapglobal!(module::Module, name::Symbol, x, [order::Symbol=:monotonic])原子的に操作を実行して、グローバルを同時に取得して設定します。
他にswapproperty!やsetglobal!も参照してください。
Core.setglobalonce! — Functionsetglobalonce!(module::Module, name::Symbol, value,
[success_order::Symbol, [fail_order::Symbol=success_order]) -> success::Bool与えられた値にグローバルを設定する操作を原子的に実行します。以前に設定されていない場合のみ実行されます。
関連情報としてsetpropertyonce!およびsetglobal!を参照してください。
Core.replaceglobal! — Functionreplaceglobal!(module::Module, name::Symbol, expected, desired,
[success_order::Symbol, [fail_order::Symbol=success_order]) -> (; old, success::Bool)原子操作を実行して、グローバルを指定された値に条件付きで設定します。
他にも replaceproperty! と setglobal! を参照してください。
Documentation
(documentation章も参照してください。)
Core.@doc — Macroドキュメンテーション
関数、メソッド、型は、定義の前に文字列を置くことでドキュメント化できます:
"""
foo(x)
`x`のfooifiedバージョンを返します。
"""
foo(x) = ...@docマクロは、ドキュメント/メタデータを設定および取得するために直接使用できます。このマクロは特別なパースを持っているため、ドキュメント化されたオブジェクトは次の行に現れることができます:
@doc "blah"
function foo() ...デフォルトでは、ドキュメントはMarkdownとして書かれますが、任意のオブジェクトを最初の引数として使用できます。
定義から独立してオブジェクトをドキュメント化する
次のようにして、オブジェクトを定義の前または後にドキュメント化できます:
@doc "foo" function_to_doc
@doc "bar" TypeToDocマクロの場合、構文は @doc "macro doc" :(Module.@macro) または文字列マクロの場合は @doc "macro doc" :(string_macro"") です。引用符 :() がない場合、マクロの展開がドキュメント化されます。
ドキュメントの取得
関数、マクロ、その他のオブジェクトのドキュメントを次のように取得できます:
@doc foo
@doc @time
@doc md""関数とメソッド
メソッド定義の前にドキュメントを置く(例:function foo() ... または foo() = ...)と、その特定のメソッドがドキュメント化され、関数全体ではなくなります。メソッドのドキュメントは、定義された順序で連結されて、関数のドキュメントを提供します。
Base.Docs.HTML — TypeHTML(s): sをhtmlとしてレンダリングするオブジェクトを作成します。
HTML("<div>foo</div>")大量のデータの場合はストリームを使用することもできます:
HTML() do io
println(io, "<div>foo</div>")
endHTMLは現在、後方互換性を維持するためにエクスポートされていますが、このエクスポートは非推奨です。この型はDocs.HTMLとして使用するか、Docsから明示的にインポートすることをお勧めします。
Base.Docs.Text — TypeText(s): sをプレーンテキストとしてレンダリングするオブジェクトを作成します。
Text("foo")大量のデータにはストリームを使用することもできます:
Text() do io
println(io, "foo")
endTextは現在、後方互換性を維持するためにエクスポートされていますが、このエクスポートは非推奨です。この型はDocs.Textとして使用するか、Docsから明示的にインポートすることをお勧めします。
Base.Docs.hasdoc — FunctionDocs.hasdoc(mod::Module, sym::Symbol)::Boolmod内のsymにドキュメント文字列がある場合はtrueを返し、そうでない場合はfalseを返します。
Base.Docs.undocumented_names — Functionundocumented_names(mod::Module; private=false)module内の文書化されていないシンボルのソートされたベクターを返します(つまり、ドキュメント文字列が欠如しているもの)。private=false(デフォルト)では、publicおよび/またはexportで宣言された識別子のみを返しますが、private=trueではモジュール内のすべてのシンボルを返します(#で始まるコンパイラ生成の隠しシンボルは除外されます)。
関連情報: names, Docs.hasdoc, Base.ispublic.
Code loading
Base.identify_package — FunctionBase.identify_package(name::String)::Union{PkgId, Nothing}
Base.identify_package(where::Union{Module,PkgId}, name::String)::Union{PkgId, Nothing}現在の環境スタックから名前でパッケージを特定し、そのPkgIdを返します。見つからない場合はnothingを返します。
name引数のみが提供された場合、スタック内の各環境とその名前付き直接依存関係を検索します。
where引数は、パッケージを検索するコンテキストを提供します。この場合、最初に名前がコンテキスト自体と一致するかを確認し、一致しない場合はすべての再帰的依存関係(各環境の解決されたマニフェストから)を検索し、コンテキストwhereを見つけ、その後対応する名前の依存関係を特定します。
julia> Base.identify_package("Pkg") # Pkgはデフォルト環境の依存関係です
Pkg [44cfe95a-1eb2-52ea-b672-e2afdf69b78f]
julia> using LinearAlgebra
julia> Base.identify_package(LinearAlgebra, "Pkg") # PkgはLinearAlgebraの依存関係ではありませんBase.locate_package — FunctionBase.locate_package(pkg::PkgId)::Union{String, Nothing}識別子 pkg に対応するパッケージのエントリポイントファイルへのパス、または見つからない場合は nothing。詳細は identify_package を参照してください。
julia> pkg = Base.identify_package("Pkg")
Pkg [44cfe95a-1eb2-52ea-b672-e2afdf69b78f]
julia> Base.locate_package(pkg)
"/path/to/julia/stdlib/v1.12/Pkg/src/Pkg.jl"Base.require — Functionrequire(into::Module, module::Symbol)この関数は、モジュールが Main にまだ定義されていない場合に using / import の実装の一部です。また、モジュールが以前にロードされていたかどうかに関係なく、モジュールの再ロードを強制するために直接呼び出すこともできます(たとえば、ライブラリをインタラクティブに開発しているとき)。
アクティブなすべてのノードで、Main モジュールのコンテキスト内でソースファイルをロードし、ファイルの標準的な場所を検索します。require はトップレベルの操作と見なされるため、現在の include パスを設定しますが、ファイルを検索するためには使用しません(include のヘルプを参照)。この関数は通常、ライブラリコードをロードするために使用され、パッケージをロードするために using によって暗黙的に呼び出されます。
ファイルを検索する際、require は最初にグローバル配列 LOAD_PATH でパッケージコードを探します。require はすべてのプラットフォームで大文字と小文字を区別し、macOS や Windows のような大文字と小文字を区別しないファイルシステムを含みます。
コードのロードに関する詳細については、modules および parallel computing に関するマニュアルのセクションを参照してください。
Base.compilecache — FunctionBase.compilecache(module::PkgId)モジュールとそのすべての依存関係のためのプリコンパイルキャッシュファイルを作成します。これはパッケージのロード時間を短縮するために使用できます。キャッシュファイルは DEPOT_PATH[1]/compiled に保存されます。重要な注意事項については Module initialization and precompilation を参照してください。
Base.isprecompiled — FunctionBase.isprecompiled(pkg::PkgId; ignore_loaded::Bool=false)指定されたプロジェクト内の PkgId がプリコンパイルされているかどうかを返します。
デフォルトでは、このチェックは、異なるバージョンの依存関係が現在読み込まれているときに、コードの読み込みが期待されるものと同じアプローチを観察します。読み込まれたモジュールを無視し、新しい Julia セッションのように答えるには、ignore_loaded=true を指定します。
Base.get_extension — Functionget_extension(parent::Module, extension::Symbol)parentのextensionのモジュールを返すか、拡張がロードされていない場合はnothingを返します。
Internals
Base.GC.gc — FunctionGC.gc([full=true])ガーベジコレクションを実行します。引数 full はコレクションの種類を決定します:フルコレクション(デフォルト)はすべての生存オブジェクト(すなわちフルマーク)を走査し、到達不可能なオブジェクトからメモリを回収する必要があります。インクリメンタルコレクションは、到達不可能でない若いオブジェクトからのみメモリを回収します。
GCは、インクリメンタルコレクションが要求されていても、フルコレクションを実行することを決定する場合があります。
Base.GC.enable — FunctionGC.enable(on::Bool)ガーベジコレクションが有効かどうかをブール引数(trueは有効、falseは無効)を使って制御します。以前のGC状態を返します。
Base.GC.@preserve — MacroGC.@preserve x1 x2 ... xn exprオブジェクト x1, x2, ... を式 expr の評価中に 使用中 としてマークします。これは、expr が x のいずれかが所有するメモリやその他のリソースを 暗黙的に使用する 不安全なコードでのみ必要です。
x の 暗黙的な使用 は、コンパイラが見ることのできない x に論理的に所有されるリソースの間接的な使用を含みます。いくつかの例:
Ptrを介してオブジェクトのメモリに直接アクセスするccallにxへのポインタを渡す- ファイナライザでクリーンアップされる
xのリソースを使用する
@preserve は、オブジェクトのライフタイムを一時的に延長する典型的な使用ケースでは、一般的にパフォーマンスに影響を与えないはずです。実装において、@preserve は動的に割り当てられたオブジェクトをガーベジコレクションから保護するなどの効果があります。
例
unsafe_load でポインタから読み込むとき、基盤となるオブジェクトは暗黙的に使用されます。たとえば、次のように unsafe_load(p) によって x が暗黙的に使用されます:
julia> let
x = Ref{Int}(101)
p = Base.unsafe_convert(Ptr{Int}, x)
GC.@preserve x unsafe_load(p)
end
101ポインタを ccall に渡すとき、指し示されているオブジェクトは暗黙的に使用され、保持されるべきです。(ただし、通常は x を直接 ccall に渡すだけで済むため、これは明示的な使用と見なされます。)
julia> let
x = "Hello"
p = pointer(x)
Int(GC.@preserve x @ccall strlen(p::Cstring)::Csize_t)
# 推奨される代替
Int(@ccall strlen(x::Cstring)::Csize_t)
end
5Base.GC.safepoint — FunctionGC.safepoint()プログラム内でガーベジコレクションが実行される可能性のあるポイントを挿入します。
セーフポイントは高速であり、ガーベジコレクションを自らトリガーすることはありません。ただし、別のスレッドがGCの実行を要求している場合、セーフポイントに到達すると現在のスレッドはブロックされ、GCを待機します。
これは、メモリを割り当てているタスク(したがってGCを実行する必要があるかもしれない)と、単純な操作(割り当てなし、タスクスイッチ、またはI/O)を行っている他のタスクがあるマルチスレッドプログラムの稀なケースで役立ちます。これらの操作はJuliaのランタイムに制御を渡さないため、GCの実行を妨げます。この関数を非割り当てタスク内で定期的に呼び出すことで、ガーベジコレクションが実行されるようになります。
セーフポイントは高速(通常約2クロックサイクル)ですが、タイトなループ内で呼び出すとパフォーマンスが低下する可能性があることに注意してください。
Base.GC.enable_logging — FunctionGC.enable_logging(on::Bool)オンにすると、各GCに関する統計をstderrに出力します。
Base.GC.logging_enabled — FunctionGC.logging_enabled()GCロギングがGC.enable_loggingを介して有効になっているかどうかを返します。
Base.Meta.lower — Functionlower(m, x)式 x を取り、モジュール m で実行するための同等の式を小文字形式で返します。詳細は code_lowered を参照してください。
Base.Meta.@lower — Macro@lower [m] xモジュール m における式 x の下位形式を返します。デフォルトでは、m はマクロが呼び出されるモジュールです。詳細は lower を参照してください。
Base.Meta.parse — Methodparse(str, start; greedy=true, raise=true, depwarn=true, filename="none")式の文字列を解析し、式を返します(これは後でevalに渡して実行することができます)。startは、解析を開始する最初の文字のstr内のコードユニットインデックスです(すべての文字列インデックスと同様に、これは文字インデックスではありません)。greedyがtrue(デフォルト)の場合、parseはできるだけ多くの入力を消費しようとします。そうでない場合、有効な式を解析した時点で停止します。未完成だがそれ以外は構文的に有効な式は、Expr(:incomplete, "(エラーメッセージ)")を返します。raiseがtrue(デフォルト)の場合、未完成の式以外の構文エラーはエラーを発生させます。raiseがfalseの場合、parseは評価時にエラーを発生させる式を返します。depwarnがfalseの場合、非推奨警告は抑制されます。filename引数は、エラーが発生したときに診断を表示するために使用されます。
julia> Meta.parse("(α, β) = 3, 5", 1) # 文字列の開始
(:((α, β) = (3, 5)), 16)
julia> Meta.parse("(α, β) = 3, 5", 1, greedy=false)
(:((α, β)), 9)
julia> Meta.parse("(α, β) = 3, 5", 16) # 文字列の終わり
(nothing, 16)
julia> Meta.parse("(α, β) = 3, 5", 11) # 3のインデックス
(:((3, 5)), 16)
julia> Meta.parse("(α, β) = 3, 5", 11, greedy=false)
(3, 13)Base.Meta.parse — Methodparse(str; raise=true, depwarn=true, filename="none")式の文字列を貪欲に解析し、単一の式を返します。最初の式の後に追加の文字がある場合はエラーがスローされます。raiseがtrue(デフォルト)の場合、構文エラーはエラーをスローします。そうでない場合、parseは評価時にエラーをスローする式を返します。depwarnがfalseの場合、非推奨警告は抑制されます。filename引数は、エラーがスローされたときに診断情報を表示するために使用されます。
julia> Meta.parse("x = 3")
:(x = 3)
julia> Meta.parse("1.0.2")
ERROR: ParseError:
# Error @ none:1:1
1.0.2
└──┘ ── 無効な数値定数
[...]
julia> Meta.parse("1.0.2"; raise = false)
:($(Expr(:error, "無効な数値定数 "1.0."")))
julia> Meta.parse("x = ")
:($(Expr(:incomplete, "不完全: 入力の早期終了")))Base.Meta.ParseError — TypeParseError(msg)parse 関数に渡された式は、有効な Julia 式として解釈できませんでした。
Core.QuoteNode — TypeQuoteNode補間をサポートしないコードの引用部分です。詳細については、QuoteNodesに関するマニュアルセクションを参照してください。
Base.macroexpand — Functionmacroexpand(m::Module, x; recursive=true)式 x を取り、モジュール m で実行するためにすべてのマクロが削除された(展開された)同等の式を返します。recursive キーワードは、ネストされたマクロのより深いレベルも展開されるかどうかを制御します。これは以下の例で示されています:
julia> module M
macro m1()
42
end
macro m2()
:(@m1())
end
end
M
julia> macroexpand(M, :(@m2()), recursive=true)
42
julia> macroexpand(M, :(@m2()), recursive=false)
:(#= REPL[16]:6 =# M.@m1)Base.@macroexpand — Macro@macroexpand [mod,] exすべてのマクロが削除された(展開された)同等の式を返します。2つの引数が提供される場合、最初の引数は評価するモジュールです。
@macroexpandとmacroexpandの間には違いがあります。
macroexpandがキーワード引数recursiveを取るのに対し、@macroexpandは常に再帰的です。非再帰的なマクロバージョンについては、@macroexpand1を参照してください。macroexpandには明示的なmodule引数がありますが、@macroexpandは常に呼び出されたモジュールに関して展開されます。
これは次の例で最もよく見られます:
julia> module M
macro m()
1
end
function f()
(@macroexpand(@m),
macroexpand(M, :(@m)),
macroexpand(Main, :(@m))
)
end
end
M
julia> macro m()
2
end
@m (macro with 1 method)
julia> M.f()
(1, 1, 2)@macroexpandを使用すると、式はコード内の@macroexpandが出現する場所(例ではモジュールM)で展開されます。macroexpandを使用すると、式は最初の引数として与えられたモジュールで展開されます。
Base.@macroexpand1 — Macro@macroexpand1 [mod,] ex@macroexpand の非再帰バージョンです。
Base.code_lowered — Functioncode_lowered(f, types; generated=true, debuginfo=:default)与えられた汎用関数と型シグネチャに一致するメソッドの低下した形式(IR)の配列を返します。
generated が false の場合、返される CodeInfo インスタンスはフォールバック実装に対応します。フォールバック実装が存在しない場合はエラーがスローされます。generated が true の場合、これらの CodeInfo インスタンスはジェネレーターを展開することによって得られるメソッド本体に対応します。
キーワード debuginfo は、出力に存在するコードメタデータの量を制御します。
generated が true の場合、types が具体的な型でないとエラーがスローされ、対応するメソッドのいずれかが @generated メソッドである場合も同様です。
Base.code_typed — Functioncode_typed(f, types; kw...)指定された汎用関数と型シグネチャに一致するメソッドの型推論された低レベル形式(IR)の配列を返します。
キーワード引数
optimize::Bool = true: オプション、インライン化などの追加最適化が適用されるかどうかを制御します。debuginfo::Symbol = :default: オプション、出力に含まれるコードメタデータの量を制御します。可能なオプションは:sourceまたは:noneです。
内部キーワード引数
このセクションは内部的なものであり、Juliaコンパイラの内部を理解している人のためのものです。
world::UInt = Base.get_world_counter(): オプション、メソッドを検索する際に使用するワールドエイジを制御します。指定されていない場合は現在のワールドエイジを使用します。interp::Core.Compiler.AbstractInterpreter = Core.Compiler.NativeInterpreter(world): オプション、使用する抽象インタープリタを制御します。指定されていない場合はネイティブインタープリタを使用します。
例
引数の型をタプルに入れることで、対応する code_typed を取得できます。
julia> code_typed(+, (Float64, Float64))
1-element Vector{Any}:
CodeInfo(
1 ─ %1 = Base.add_float(x, y)::Float64
└── return %1
) => Float64Base.precompile — Functionprecompile(f, argtypes::Tuple{Vararg{Any}}, m::Method)指定された引数の型に対して特定のメソッドをプリコンパイルします。これは、ディスパッチによって通常選択されるメソッドとは異なるメソッドをプリコンパイルするために使用でき、invokeを模倣します。
precompile(f, argtypes::Tuple{Vararg{Any}})与えられた関数 f を引数タプル(型の) argtypes に対してコンパイルしますが、実行はしません。
Base.jit_total_bytes — FunctionBase.jit_total_bytes()JITコンパイラによって割り当てられた合計量(バイト単位)を返します。例えば、ネイティブコードやデータなどです。
Meta
Base.Meta.quot — FunctionMeta.quot(ex)::Expr式 ex を引用して、先頭が quote の式を生成します。これは例えば、AST内の Expr 型のオブジェクトを表現するために使用できます。QuoteNode に関するマニュアルのセクションも参照してください。
例
julia> eval(Meta.quot(:x))
:x
julia> dump(Meta.quot(:x))
Expr
head: Symbol quote
args: Array{Any}((1,))
1: Symbol x
julia> eval(Meta.quot(:(1+2)))
:(1 + 2)Base.isexpr — FunctionMeta.isexpr(ex, head[, n])::Boolex が指定された型 head の Expr であり、オプションで引数リストの長さが n である場合に true を返します。head は Symbol または Symbol のコレクションである可能性があります。たとえば、マクロに関数呼び出し式が渡されたかどうかを確認するには、isexpr(ex, :call) を使用することができます。
例
julia> ex = :(f(x))
:(f(x))
julia> Meta.isexpr(ex, :block)
false
julia> Meta.isexpr(ex, :call)
true
julia> Meta.isexpr(ex, [:block, :call]) # 複数の可能なヘッド
true
julia> Meta.isexpr(ex, :call, 1)
false
julia> Meta.isexpr(ex, :call, 2)
trueBase.isidentifier — Function isidentifier(s) -> Boolシンボルまたは文字列 s が、Julia コード内で有効な通常の識別子(バイナリ/ユニアリオペレーターではない)として解析される文字を含むかどうかを返します。詳細は Base.isoperator を参照してください。
内部的に、Julia は Symbol 内の任意の文字列のシーケンスを許可します(\0 を除く)、マクロは周囲のコードとの名前の衝突を避けるために # を含む変数名を自動的に使用します。パーサーが変数を認識するためには、限られた文字のセットを使用します(Unicode によって大幅に拡張されています)。isidentifier() を使用すると、シンボルが有効な文字を含むかどうかをパーサーに直接問い合わせることができます。
例
julia> Meta.isidentifier(:x), Meta.isidentifier("1x")
(true, false)Base.isoperator — Functionisoperator(s::Symbol)シンボルが演算子として使用できる場合は true を返し、それ以外の場合は false を返します。
例
julia> Meta.isoperator(:+), Meta.isoperator(:f)
(true, false)Base.isunaryoperator — Functionisunaryoperator(s::Symbol)シンボルが単項(接頭辞)演算子として使用できる場合は true を返し、それ以外の場合は false を返します。
例
julia> Meta.isunaryoperator(:-), Meta.isunaryoperator(:√), Meta.isunaryoperator(:f)
(true, true, false)Base.isbinaryoperator — Functionisbinaryoperator(s::Symbol)シンボルが二項(中置)演算子として使用できる場合は true を返し、それ以外の場合は false を返します。
例
julia> Meta.isbinaryoperator(:-), Meta.isbinaryoperator(:√), Meta.isbinaryoperator(:f)
(true, false, false)Base.Meta.show_sexpr — FunctionMeta.show_sexpr([io::IO,], ex)式 ex をリスプスタイルのS式として表示します。
例
julia> Meta.show_sexpr(:(f(x, g(y,z))))
(:call, :f, :x, (:call, :g, :y, :z))