基本的な関数
はじめに
Julia Base ライブラリには科学計算や数値計算で使われる様々な関数やマクロの中で、他の汎用プログラミング言語でも見られる一般的なものが含まれています。これ以外の機能は日々追加される種々のパッケージから利用できます。このドキュメントでは Julia Base に含まれる関数をトピックごとに分けて示します。
一般的な注意事項を示します:
- モジュールの関数を使うには、
import ModuleとしてモジュールをインポートしてからModule.fn(x)とします。 import Moduleの代わりにusing Moduleとすると、Moduleがエクスポートする全ての関数が現在の名前空間にインポートされます。- 慣習により、名前の最後に感嘆符 (
!) が付く関数は引数を変更します。引数を変更するバージョンと変更しないバージョンの両方を持つ関数もあります (sort!とsortなど)。
言語で基礎的な役割を持つ関数
Base.atexit ── 関数
atexit(f)
ゼロ引数の関数 f() をプロセスが終了するときに呼ばれる関数として登録します。atexit() で設定した終了フックは後入れ先出し (last in first out, LIFO) の順序でオブジェクトのファイナライザの前に呼び出されます。
終了フックは exit(n) を呼び出すことを許されており、こうすると Julia の終了コードが n になります (元々の終了コードは無視されます)。複数の終了フックが exit(n) を呼んだ場合には、Julia は最後に呼び出された exit(n) に渡された値を最終的な終了コードとします (終了フックは LIFO の順序で呼ばれるので、「最後に呼び出された」は「最初に登録された」と等価です)。
Base.isinteractive ── 関数
Base.summarysize ── 関数
Base.summarysize(obj; exclude=Union{...}, chargeall=Union{...}) -> Int
引数に渡されたオブジェクトから到達可能なユニークなオブジェクトが使用しているメモリの総量を計算して返します (単位はバイト)。
キーワード引数
exclude: 走査から除外するオブジェクトの型を指定します。chargeall: 必ず全てのフィールドをサイズに数えるオブジェクトの型を指定します。通常は除外される型を持つフィールドであっても、chargeallに指定した型のフィールドはサイズとしてカウントされます。
Base.require ── 関数
require(into::Module, module::Symbol)
これは using と import の実装で使われる関数であり、モジュールがこれまでに Main で定義されていないときに呼ばれます。これまでに読み込んだかどうかに関係なくモジュールの再読み込みを強制的に行うために require を直接呼び出すこともできます (ライブラリを対話的に開発しているときなど)。
全てのアクティブなノード上で、Main モジュールのコンテキストでソースファイルを読み込みます。ファイルは標準的な場所から検索されます。require はトップレベルの操作とみなされるので、ファイルを読み込んでいる間だけ有効なパスを設定しますが、そのパスはファイルの検索に利用されません (参照: include)。この関数は通常ライブラリコードを読み込むのに使われ、パッケージを読み込むときにもusing から間接的に呼ばれます。
ファイルを検索するとき、require は最初グローバル配列 LOAD_PATH に含まれるパッケージコードを検索します。require は全てのプラットフォームで大文字と小文字を区別して検索を行います。この振る舞いは macOS や Windows のような大文字と小文字を区別しないファイルシステムを持つプラットフォームでも同様です。
Base.compilecache ── 関数
Base.compilecache(module::PkgId)
モジュール module とその依存モジュールに対して事前コンパイルを行い、キャッシュファイルを作成します。この関数はパッケージの読み込み時間を短縮するために利用できます。作成されるキャッシュファイルは DEPOT_PATH[1]/compiled に保存されます。モジュールの初期化と事前コンパイルの節に詳しい情報があります。
Base.__precompile__ ── 関数
__precompile__(isprecompilable::Bool)
この関数を呼び出したファイルが事前コンパイルできるかどうかを指定します。デフォルトは true です。モジュールあるいはファイルを安全に事前コンパイルできないなら、そのモジュールあるいはファイルから __precompile__(false) を呼び出して Julia が事前コンパイルしようとしたときにエラーが発生するように設定すべきです。
Base.include ── 関数
Base.include([mapexpr::Function,] [m::Module,] path::AbstractString)
モジュール m のグローバルスコープで入力されたソースファイルの内容を評価します。baremodule で定義されたモジュールを除く全てのモジュールには m 引数を省略した include 関数が定義され、この include 関数は自身が含まれるモジュールでファイルを評価します。入力ファイルで最後に評価した式の評価結果を返します。インクルード処理の間、インクルードされるファイルを含むディレクトリがタスクにローカルなインクルードパスに設定されます。そのため include をネストして呼び出すと、最初に読み込んだファイルを含むディレクトリからの相対パスも検索されます。通常この関数が使われるのはソースを対話的に読み込むとき、および複数のソースファイルに分割されたパッケージを一つに組み合わせるときです。
省略可能な第一引数 mapexpr を使うとインクルードされるコードを評価する前に変形できます。path 内のパースされた全ての式 expr について、include は mapexpr(expr) を評価します。mapexpr が省略されたときのデフォルト値は identity です。
Base.MainInclude.include ── 関数
include([mapexpr::Function,] path::AbstractString)
この関数を持つモジュールのグローバルスコープでファイル path の内容を評価します。(baremodule で定義されたモジュールを除く) 全てのモジュールそれぞれに include 関数が定義され、その include 関数はそのモジュールでファイルを評価します。入力ファイルで最後に評価した式の評価結果を返します。インクルード処理の間、インクルードされるファイルを含むディレクトリがタスクにローカルなインクルードパスに設定されます。そのため include をネストして呼び出すと、最初に読み込んだファイルを含むディレクトリからの相対パスも検索されます。通常この関数が使われるのはソースを対話的に読み込むとき、および複数のソースファイルに分割されたパッケージを一つに組み合わせるときです。
省略可能な第一引数 mapexpr を使うとインクルードされるコードを評価する前に変形できます。path 内のパースされた全ての式 expr について、include は mapexpr(expr) を評価します。mapexpr が省略されたときのデフォルト値は identity です。
他のモジュールでファイルを評価するには Base.include を使ってください。
Base.include_string ── 関数
include_string([mapexpr::Function,]
m::Module,
code::AbstractString,
filename::AbstractString="string")
include と同様ですが、コードをファイルからではなく与えられた文字列から読み込みます。
省略可能な第一引数 mapexpr を使うとインクルードされるコードを評価する前に変形できます。path 内のパースされた全ての式 expr について、include_string は mapexpr(expr) を評価します。mapexpr が省略されたときのデフォルト値は identity です。
Base.include_dependency ── 関数
Base.which ── メソッド
Base.methods ── 関数
methods(f, [types], [module])
f のメソッドテーブルを返します。
types が指定されると、型が合うメソッドの配列を返します。module が指定されると、そのモジュールで定義されるメソッドを返します。配列を使ってモジュールのリストを指定することもできます。
methods でモジュールを指定するには最低でも Julia 1.4 が必要です。
Base.@show ── マクロ
キーワード
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 も中置演算子としてパースされます。ただし where, in, isa という名前の変数を作ることはできます。
module ── キーワード
module
module はモジュールを宣言します。モジュールは独立したグローバル変数のワークスペースです。モジュール内部では他のモジュールが持つ名前のどれが見えるかを (インポートで) 制御でき、また自身のモジュールに含まれる名前の中でパブリックにするのはどれかを (エクスポートで) 指定できます。モジュールを使えば、他のコードと一緒に使われたときの名前の衝突を気にすることなくトップレベルの定義を作成できます。詳細はマニュアルのモジュールの章を参照してください。
例
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)")
end
baremodule ── キーワード
macro ── キーワード
macro
macro は生成されたコードをプログラムに挿入する手続きを定義します。マクロは引数に式の列を受け取って一つの式を返し、返り値の式はプログラムのマクロを呼び出した場所に直接挿入されます。マクロによって生成されたコードは周りのプログラムの一部となるので、マクロは eval を使わずにコードを生成して実行するための仕組みと言えます。マクロの引数として許されているのは式・リテラル値・シンボルです。可変長引数を持つマクロは定義できますが、マクロでキーワード引数は使えません。
例
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 friend
return ── キーワード
return
関数で return 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
としたとき、一つ目の例では x が最初に偶数となったときに return が test1 関数を終了させるので、test1([5,6,7]) は 12 を返します。
二つ目の例でも同じだろうと思うかもしれませんが、test2 に含まれる return は内側の関数 (do ブロックの内側の関数) を終了させ、return に渡される値 2x は map の返り値の一部となります。そのため test2([5,6,7]) は [5,12,7] を返します。
トップレベル (つまり関数の外) で return を使うと、現在のトップレベル式がその時点で終了します。
let ── キーワード
let
let 文は実行するたびに新しい変数束縛をアロケートします。代入文は値の保管場所が既に作成されていればそれを再利用しますが、let は必ず新しい保管場所を作成するということです。この違いによって動作が変わるのは、クロージャを通して変数がスコープが終わった後も生き残る場合だけです。let の構文はコンマで区切られた代入文と変数の名前の列を受け取ります:
let var1 = value1, var2, var3 = value3
code
end
代入文は順番に評価され、右辺は左辺の変数が作成される前のスコープで評価されます。そのため let x = x としても問題はありません。x で表される二つの変数は異なる変数であり、個別の格納場所を持つためです。
if ── キーワード
if/elseif/else
if/elseif/else は条件的な評価を行います。これを使えばコードの一部分を評価するかどうかを特定の真偽値の値に応じて切り替えられます。if/elseif/else の使い方を示す例を示します:
if x < y
println("x is less than y.")
elseif x > y
println("x is greater than y.")
else
println("x is equal to y.")
end
最初の条件式 x < y が true だと、その直後にある対応するブロックが評価されます。そうでなければ次の条件式 x > y が評価され、それが true なら、その直後のブロックが評価されます。二つの条件文がどちらも false なら、else ブロックが評価されます。elseif と else は省略可能であり、elseif は好きな数だけ付けられます。
try ── キーワード
try/catch
try/catch を使うと、throw が発生させるエラー (例外) を捕捉し、プログラムの実行を継続させることができます。例えば次のコードはファイルへ書き込みを行いますが、ファイルが書き込めないときに実行を終了せず、ユーザーに警告を表示します:
try
open("/danger", "w") do f
println(f, "Hello")
end
catch
@warn "Could not write file."
end
次に示すのは、ファイルから読むときに同様の動作をするコードです:
lines = try
open("/danger", "r") do f
readlines(f)
end
catch
@warn "File not found."
end
catch e (e は任意の名前) という構文を使うと、発生した例外オブジェクトを catch ブロックで有効な変数 e に束縛できます。
try/catch 構文の強みは、深くネストされた処理から呼び出しスタックのずっと高い位置まで一気に戻れることです。
finally ── キーワード
finally
与えられたブロックの実行が終わったときに、どう終わったかに関係なく実行するブロックを指定します。例えば、次のコードでは開かれたファイルが閉じられることが保証されています:
f = open("file")
try
operate_on_file(f)
finally
close(f)
end
制御が try ブロックから離れるとき (例えば return を呼んだとき、あるいは通常通り実行を終えたとき)、close(f) が必ず実行されます。try ブロックの実行が例外によって終了したときは、finally ブロックが実行されてから例外が上へ伝播されます。catch ブロックを try/finally と組み合わせることもでき、その場合 finally ブロックは catch がエラーを処理した後に呼ばれます。
const ── キーワード
const
const は値が変更されないグローバル変数を宣言するときに使います。ほぼ全てのコードにおいて (特に性能が重要なコードでは)、グローバル変数は const を使って定数と宣言されるべきです。
const x = 5
一つの const で複数の変数を定数として宣言できます:
const y, z = 7, 11
const は一つの = 演算だけに適用されるので、const x = y = 1 としても定数になるのは x だけで y は定数にならないことに注意してください。これに対して const x = const y = 1 とすれば x と y の両方が定数となります。
また可変コンテナは "定数" にならないことにも注意が必要です。定数になるのは、変数と値の間の結びつきだけです。例えば x が const x と定義された配列や辞書であったとしても、それに対する要素の変更/追加/削除は可能です。
一部の状況では const 変数の値を変えたときにエラーではなく警告が発生することがあります。しかし、その後に予期できない振る舞いやプログラムの状態の破壊が引き起こされる可能性があるので、定数の値の変更は行わないでください。この機能は対話的な利用を便利にするために追加されたものです。
struct ── キーワード
struct
Julia で最もよく使われる型は構造体です。構造体は名前とフィールドの集合で定義されます:
struct Point
x
y
end
フィールドには型の制約を付けることができ、パラメータ化も可能です:
struct Point{X}
x::X
y::Float64
end
<: を使うと、抽象型を構造体の上位型として宣言できます:
struct Point <: AbstractPoint
x
y
end
struct はデフォルトで不変 (immutable) です: struct で作成した型のインスタンスは、一度構築すると変更できません。インスタンスを変更できる型を宣言するには mutable struct を使ってください。
コンストラクタの定義方法など詳しくはマニュアルの複合型の節を参照してください。
mutable struct ── キーワード
abstract type ── キーワード
abstract type
abstract type はインスタンス化できない型 (抽象型) を宣言します。abstract type で宣言される抽象型は型グラフにおける頂点としてのみ利用でき、関連する具象型 (型グラフで子となる型) の集合を表します。抽象型は Julia の型システムをオブジェクトの実装の寄せ集め以上のものにする理論的な型階層を形成します。例えば次のように使われます:
abstract type Number end
abstract type Real <: Number end
Number は上位型を持たない抽象型で、Real は Number の部分型である抽象型であることをこのコードは表しています。
primitive type ── キーワード
primitive type
primitive type はデータがビット列だけで構成される具象型 (プリミティブ型) を宣言します。プリミティブ型の典型例は整数型と浮動小数点数型です。組み込みのプリミティブ型宣言の例を示します:
primitive type Char 32 end
primitive type Bool <: Integer 8 end
名前の後の数値は、その型の保存に必要なビット数を表します。現在の Julia は 8 の倍数のサイズだけをサポートします。上記の Bool の宣言のように、何らかの上位型の部分型としてプリミティブ型を宣言することもできます。
where ── キーワード
where
where を使うと、「ある変数が取り得る値のそれぞれで宣言される型を全て合併した型」を定義できます。例えば Vector{T} where T<:Real には要素型が何らかの Real である Vector が全て含まれます。
変数の上界を省略すると Any がデフォルト値として使われます:
Vector{T} where T # "Vector{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, ...} によってパラメータに型が "適用" されるときに置換が起こる順番と同じです。
; ── キーワード
;
Julia の ; は C に似た言語と同様の意味を持ち、それまでの文を区切るために使われます。改行があれば ; は必要ありませんが、同じ行に書かれる複数の文を区切るときや複数の文を一つの式にまとめるときに ; は利用できます。REPL などのインターフェースで評価結果の出力を抑制するときにも ; は使われます。
例
julia> function foo()
x = "Hello, "; x *= "World!"
return x
end
foo (generic function with 1 method)
julia> bar() = (x = "Hello, Mars!"; return x)
bar (generic function with 1 method)
julia> foo();
julia> bar()
"Hello, Mars!"
= ── キーワード
=
代入演算子です。
- 変数
aと式bに対して、a = bはaの参照先をbの値とします。 f(x) = Xは関数fが定義されていなければ新しい関数定数fを定義し、fが定義されていればそれに新しいメソッドを追加します。f(x) = Xは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 Array{Int64,1}:
2
julia> b = [1]; a = copy(b); b[1] = 2; a
1-element Array{Int64,1}:
1
関数に渡されるコレクションもコピーされません。関数は引数が指すオブジェクトの内容を変更 (改変) できます (引数を変更する関数は名前の最後を ! とするのが慣習となっています):
julia> function f!(x); x[:] .+= 1; end
f! (generic function with 1 method)
julia> a = [1]; f!(a); a
1-element Array{Int64,1}:
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 Array{Int64,1}:
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 Array{Int64,1} at index [3]
[...]
julia> push!(a, 2, 3)
4-element Array{Int64,1}:
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) # インプレースなので a = a[a .> 1] より高速
2-element Array{Int64,1}:
2
3
標準モジュール
Main ── モジュール
Base のサブモジュール
Base.Broadcast ── モジュール
ブロードキャストの実装を提供します。
Base.Iterators ── モジュール
反復子を使うためのメソッドを提供します。
Base.StackTraces ── モジュール
スタックトレースの収集・操作を行うツールを提供します。主にエラーの構築に使われます。
Base.Threads ── モジュール
マルチスレッディングのサポートを提供します。
全てのオブジェクトに関係する関数
Core.:=== ── 関数
===(x,y) -> Bool
≡(x,y) -> Bool
x と y が同じかどうかを判定します。ここで言う "同じ" とは、どんなプログラムを使っても区別できないという意味です。まず x と y の型が比較されます。型が一致すると可変なオブジェクトはアドレスで比較され、不変なオブジェクト (数値など) はビット列として比較されます。この関数は「精密な比較」と呼ばれることもあります。返り値は必ず Bool 型の値です。
例
julia> a = [1, 2]; b = [1, 2];
julia> a == b
true
julia> a === b
false
julia> a === a
true
Base.isequal ── 関数
isequal(x, y)
基本的に == と同様ですが、浮動小数点数と欠損値の扱いが異なります。isequal は NaN と NaN を等しいとみなし、-0.0 と 0.0 を異なるとみなし、missing と missing を等しいとみなします。返り値は必ず Bool 型の値です。
実装
isequal のデフォルト実装は == を呼ぶので、浮動小数点数が絡まない型で定義する必要があるのは == だけです。
isequal はハッシュテーブル Dict が使う比較関数です。「isequal(x,y) ならば hash(x) == hash(y)」が成り立つ必要があります。
通常これは == や isequal のメソッドを独自に定義する型では対応する hash のメソッドも定義しなければならないこと (およびその逆) を意味します。多くのコレクション型は各要素に対して isequal を再帰的に呼び出すことで isequal を計算します。
スカラー型では基本的に == と異なる isequal を個別に定義する必要はありません。ただし、浮動小数点数を表現する型で 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
Base.isless ── 関数
isless(x, y)
x が y より小さいかどうかを判定します。比較には固定された全順序が使われます。isless は全ての (x, y) の組に対して定義されているとは限りませんが、定義されるなら次の条件を満たすことが期待されます:
isless(x,y)が定義されているならisless(y,x)とisequal(x,y)も定義され、三つの中でちょうど一つがtrueを返す必要がある。islessが定義する関係は推移律を満たす必要がある。つまり「isless(x,y) && isless(y,z)ならばisless(x,z)」が成り立たなければならない。
NaN のような通常は順序付いていない値には恣意的な順序が付いていますが、その順序は一貫しています。値 missing は順序で最後に位置付けられます。
isless は sort が使うデフォルトの比較関数です。
実装
全順序を持つ数値でない型はこの関数を実装するべきです。数値型では NaN などの特殊な値を持つときにだけ実装が必要です。半順序を持つ型では < を実装してください。
例
julia> isless(1, 3)
true
julia> isless("Red", "Blue")
false
Core.ifelse ── 関数
ifelse(condition::Bool, x, y)
condition が true なら x を返し、そうでなければ y を返します。これは関数なので、? や if とは異なり全ての引数が最初に評価されます。if の代わりに ifelse を使うと生成されるコードから分岐が消えるので、性能が要求されるループで性能を改善できる場合があります。
例
julia> ifelse(1 > 2, 1, 2)
2
Core.typeassert ── 関数
Core.typeof ── 関数
typeof(x)
x の具象型を取得します。
例
julia> a = 1//2;
julia> typeof(a)
Rational{Int64}
julia> M = [1 2; 3.5 4];
julia> typeof(M)
Array{Float64,2}
Core.tuple ── 関数
Base.ntuple ── 関数
ntuple(f::Function, n::Integer)
長さ n で i 番目の要素が f(i) であるタプルを作成します。
例
julia> ntuple(i -> 2*i, 4)
(2, 4, 6, 8)
Base.objectid ── 関数
objectid(x)
オブジェクトのアイデンティティを使って計算される x のハッシュ値を取得します。「x === y ならば objectid(x) == objectid(y)」が成り立ちます。
Base.hash ── 関数
hash(x[, h::UInt])
オブジェクト x の整数のハッシュコードを計算します。「isequal(x,y) ならば hash(x)==hash(y)」が成り立ちます。省略可能な第二引数 h は計算結果と混ぜ合わせるハッシュコードを表します。
新しい型は二引数のメソッドを実装するべきです。典型的には二引数の hash メソッドを再帰的に呼び出し、オブジェクトが持つ要素それぞれのハッシュ (および h) を混ぜ合わせることでハッシュを計算する手続きが実装されます。基本的に、hash を実装する全ての型は == を独自に実装するべきです (このとき isequal も独自の実装となります)。また減算 (- 演算子) をサポートする型では、異種の要素を含む配列でハッシュを計算するために必要な widen も実装するべきです。
Base.finalizer ── 関数
finalizer(f, x)
x に対するプログラムからアクセス可能な参照が存在しなくなったときに呼ばれる関数として f(x) を登録します。x の型は mutable struct である必要があり、そうでなければこの関数は予期できない振る舞いをします。
f はタスクを切り替えてはいけません。このため println など大部分の IO 操作は行えません。デバッグでは @async マクロ (ファイナライザ外へのコンテキストスイッチを行わせる) や ccall を使って IO 関数を直接起動するとよいでしょう。
例
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
Base.finalize ── 関数
Base.deepcopy ── 関数
deepcopy(x)
x の深いコピーを作成します: 全ての要素が再帰的コピーされ、完全に独立したオブジェクトが作成されます。例えば配列を深くコピーすると、オリジナルの要素を深くコピーした値を要素に持つ新しい配列が作成されます。オブジェクトに対して deepcopy を呼ぶのは、一般に同じオブジェクトを一度シリアライズしてデシリアライズするのと同じ効果を持ちます。
通常は必要になりませんが、ユーザー定義型に対するデフォルトの deepcopy の振る舞いはオーバーライドできます。ユーザー型 T の deepcopy をオーバーライドするには、deepcopy_internal(x::T, dict::IdDict) 関数を特殊化したメソッドを定義します。ここで dict は再帰呼び出しにおいてコピーされたオブジェクトを保持する辞書です。定義する deepcopy_internal の本体では、deepcopy を使う場所で deepcopy_internal を使い、返すときに dict 変数を適切に更新する必要があります。
Base.getproperty ── 関数
getproperty(value, name::Symbol)
構文 a.b は getproperty(a, :b) を呼び出します。
例
julia> struct MyType
x
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
1
propertynames と setproperty! も参照してください。
Base.setproperty! ── 関数
setproperty!(value, name::Symbol, x)
構文 a.b = c は setproperty!(a, :b, c) を呼び出します。
propertynames と getproperty も参照してください。
Base.propertynames ── 関数
propertynames(x, private=false)
オブジェクト x のプロパティ (x.property) からなるタプルまたはベクトルを返します。これは基本的に fieldnames(typeof(x)) と同じです。ただし getproperty をオーバーロードする型のインスタンスからプロパティを取得するには、一般に propertynames もオーバーロードする必要があります。
propertynames(x) が返せるのは、ドキュメントされた x のインターフェースに含まれる "パブリックな" プロパティだけです。内部での使用が意図される "プライベートな" フィールド名を取得したいなら、省略可能な第二引数を true としてください1。x. に対する REPL のタブ補完は private=false で取得できるプロパティしか表示しません。
Base.hasproperty ── 関数
hasproperty(x, s::Symbol)
オブジェクト x がプロパティに s を持つかどうかを示す真偽値を返します。
この関数は Julia 1.2 以降でサポートされます。
Core.getfield ── 関数
getfield(value, name::Symbol)
getfield(value, i::Int)
複合型の値 value から名前または位置を使ってフィールドを取り出します。getproperty と fieldnames も参照してください。
例
julia> a = 1//2
1//2
julia> getfield(a, :num)
1
julia> a.num
1
julia> getfield(a, 1)
1
Core.setfield! ── 関数
setfield!(value, name::Symbol, x)
複合型の値 value のフィールド name に x を代入します。value は可変である必要があり、x は fieldtype(typeof(value), name) の部分型である必要があります。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 changed
Core.isdefined ── 関数
isdefined(m::Module, s::Symbol)
isdefined(object, s::Symbol)
isdefined(object, index::Int)
グローバル変数もしくはオブジェクトのフィールドが定義されているかどうかを判定します。引数は「モジュールとシンボル」または「複合型オブジェクトとフィールド名 (を表すシンボル)」または「複合型オブジェクトと位置」です。
配列の要素が定義されているかどうかを判定するには isassigned を使ってください。
@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)
false
Base.@isdefined ── マクロ
Base.convert ── 関数
convert(T, x)
x を T 型の値に変換します。
T が Integer 型なら、x が T で表現できないとき InexactError が発生します。例えば x が整数でない場合や、x が T で表せる範囲を超えている場合です。
例
julia> convert(Int, 3.0)
3
julia> convert(Int, 3.5)
ERROR: InexactError: Int64(3.5)
Stacktrace:
[...]
T が AbstractFloat 型もしくは Rational 型なら、T が表現できる値の中で最も x に近い値が返ります:
julia> x = 1/3
0.3333333333333333
julia> convert(Float32, x)
0.33333334f0
julia> convert(Rational{Int32}, x)
1//3
julia> convert(Rational{Int64}, x)
6004799503160661//18014398509481984
T がコレクション型で x がコレクションのときは、convert(T, x) の結果が x の一部または全部の別名となる可能性があります:
julia> x = Int[1, 2, 3];
julia> y = convert(Vector{Int}, x);
julia> y === x
true
Base.promote ── 関数
promote(xs...)
引数を共通の型に変換し、変換結果をタプルとして返します。引数を共通の型へ変換できないときはエラーが発生します。
例
julia> promote(Int8(1), Float16(4.5), Float32(4.1))
(1.0f0, 4.5f0, 4.1f0)
Base.oftype ── 関数
oftype(x, y)
y を x の型へ変換します。convert(typeof(x), y) と等価です。
例
julia> x = 4;
julia> y = 3.;
julia> oftype(x, y)
3
julia> oftype(y, x)
4.0
Base.widen ── 関数
widen(x)
x が型なら、それを "広げた" 型を返します。つまり、x 型の値の任意の組に対する + と - がオーバフローや精度落ちを起こさない型を返します。
128 ビットより小さい固定幅整数型に対しては、widen はビット数を倍にした型を返します。
x が値なら、x を widen(typeof(x)) に変換した値を返します。
例
julia> widen(Int32)
Int64
julia> widen(1.5f0)
1.5
Base.identity ── 関数
identity(x)
恒等関数です。引数を返します。
例
julia> identity("Well, what did you expect?")
"Well, what did you expect?"
型のプロパティ
型の関係
Base.supertype ── 関数
Core.DataType ── 型
DataType <: Type{T}
明示的に宣言される型を表します。DataType は名前と明示的に宣言される上位型、そして省略可能なパラメータを持ちます。Julia の型システムにおいて、全ての具象値は何らかの DataType のインスタンスです。
例
julia> typeof(Real)
DataType
julia> typeof(Int)
DataType
julia> struct Point
x::Int
y
end
julia> typeof(Point)
DataType
Base.typejoin ── 関数
Base.typeintersect ── 関数
Base.promote_type ── 関数
promote_type(type1, type2)
昇格 (promotion) とは異なる型を持つ複数の値を一つの共通の型に変換することを言います。promote_type は演算子 (多くは数学演算子) に異なる型の引数が渡されたときの Julia デフォルトの昇格の振る舞いを表します。promote_type は一般に、入力の値を少なくとも近似できる型であって広すぎないものを返そうとします。多少の誤差は許容されます: 例えば promote_type(Int64, Float64) は Float64 を返しますが、全ての Int64 の値が Float64 の値として正確に表せるわけではありません。
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
Base.promote_rule ── 関数
Base.isdispatchtuple ── 関数
isdispatchtuple(T)
型 T が「葉型」のタプル型かどうかを判定します。タプル型が「葉型」とは、その型がディスパッチの型シグネチャに現れることができ、かつその部分型 (および上位型) は現れることができないことを意味します。
宣言構造体
Base.ismutable ── 関数
Base.isimmutable ── 関数
Base.isabstracttype ── 関数
isabstracttype(T)
型 T が抽象型として (つまり abstract キーワードを使って) 宣言されたかどうかを判定します。
例
julia> isabstracttype(AbstractArray)
true
julia> isabstracttype(Vector)
false
Base.isprimitivetype ── 関数
Base.issingletontype ── 関数
Base.isstructtype ── 関数
isstructtype(T) -> Bool
型 T が構造体型として (つまり struct キーワードまたは mutable struct キーワードを使って) 宣言されたかどうかを判定します。
Base.nameof ── メソッド
nameof(t::DataType) -> Symbol
DataType の名前をシンボルとして取得します。t は UnionAll でラップされていても構いません。
例
julia> module Foo
struct S{T}
end
end
Foo
julia> nameof(Foo.S{T} where T)
:S
Base.fieldnames ── 関数
fieldnames(x::DataType)
DataType のフィールド名からなるタプルを取得します。
例
julia> fieldnames(Rational)
(:num, :den)
Base.fieldname ── 関数
fieldname(x::DataType, i::Integer)
DataType の i 番目のフィールド名を取得します。
例
julia> fieldname(Rational, 1)
:num
julia> fieldname(Rational, 2)
:den
Base.hasfield ── 関数
hasfield(T::Type, name::Symbol)
T が name をフィールドに持つかどうかを示す真偽値を返します。
この関数は Julia 1.2 以降でサポートされます。
メモリレイアウト
Base.sizeof ── メソッド
sizeof(T::DataType)
sizeof(obj)
型 T に正準バイナリ表現が存在するなら、そのサイズを返します (単位はバイト)。T が DataType 型の値でないなら、オブジェクト obj のサイズを返します (単位はバイト)。
例
julia> sizeof(Float32)
4
julia> sizeof(ComplexF64)
16
julia> sizeof(1.0)
8
julia> sizeof([1.0:10.0;])
80
DataType 型の値 T が決まったサイズを持たないときはエラーが発生します。
julia> sizeof(AbstractArray)
ERROR: Abstract type AbstractArray does not have a definite size.
Stacktrace:
[...]
Base.isconcretetype ── 関数
isconcretetype(T)
型 T が具象型かどうかを判定します。型 T が具象型とは、typeof(x) == T が成り立つ直接のインスタンス x が存在することを意味します。
例
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})
false
Base.isbits ── 関数
Base.isbitstype ── 関数
isbitstype(T)
T が "プレーンデータ型" なら true を返します。プレーンデータ型とは、プリミティブ型と他のプレーンデータ型だけを含み他の値を参照しない不変型を言います。典型的な例は UInt8, Float64, Complex{Float64} のような数値型です。このカテゴリに属する型は型パラメータとして利用でき、isdefined や isassigned のための追跡を必要とせず、C と互換性のあるレイアウトが定義されるので、このカテゴリは重要です。
例
julia> isbitstype(Complex{Float64})
true
julia> isbitstype(Complex)
false
Core.fieldtype ── 関数
fieldtype(T, name::Symbol | index::Int)
複合型 T の指定されたフィールドが持つ宣言された型を返します。フィールドは名前もしくは位置で指定されます。
例
julia> struct Foo
x::Int64
y::String
end
julia> fieldtype(Foo, :x)
Int64
julia> fieldtype(Foo, 2)
String
Base.fieldtypes ── 関数
fieldtypes(T::Type)
複合型 T の全フィールドの宣言された型をタプルとして返します。
この関数は Julia 1.1 以降でサポートされます。
例
julia> struct Foo
x::Int64
y::String
end
julia> fieldtypes(Foo)
(Int64, String)
Base.fieldcount ── 関数
Base.fieldoffset ── 関数
fieldoffset(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)
12-element Array{Tuple{UInt64,Symbol,DataType},1}:
(0x0000000000000000, :device, UInt64)
(0x0000000000000008, :inode, UInt64)
(0x0000000000000010, :mode, UInt64)
(0x0000000000000018, :nlink, Int64)
(0x0000000000000020, :uid, UInt64)
(0x0000000000000028, :gid, UInt64)
(0x0000000000000030, :rdev, UInt64)
(0x0000000000000038, :size, Int64)
(0x0000000000000040, :blksize, Int64)
(0x0000000000000048, :blocks, Int64)
(0x0000000000000050, :mtime, Float64)
(0x0000000000000058, :ctime, Float64)
Base.datatype_alignment ── 関数
Base.datatype_alignment(dt::DataType) -> Int
型 dt のインスタンスが持つ最小のメモリアライメント要件を返します。任意の具象型に対して呼び出せます。
Base.datatype_haspadding ── 関数
Base.datatype_haspadding(dt::DataType) -> Bool
型 dt のインスタンスのフィールドをパディングバイトを使わずにメモリに詰め込めるかどうかを判定し、パディングを持つなら true を返します。任意の具象型に対して呼び出せます。
Base.datatype_pointerfree ── 関数
Base.datatype_pointerfree(dt::DataType) -> Bool
型 dt のインスタンスが GC に管理されるメモリを指す参照を持つかどうかを判定し、持たないなら true を返します。任意の具象型に対して呼び出せます。
特殊な値
Base.typemin ── 関数
typemin(T)
与えれた (実) 数値型 T が表せる最小の値を返します。T は DataType である必要があります。
例
julia> typemin(Float16)
-Inf16
julia> typemin(Float32)
-Inf32
Base.typemax ── 関数
typemax(T)
与えれた (実) 数値型 T が表せる最大の値を返します。T は DataType である必要があります。
例
julia> typemax(Int8)
127
julia> typemax(UInt32)
0xffffffff
Base.floatmin ── 関数
floatmin(T=Float64)
浮動小数点数型 T で非正規化数を使わずに表現できる最小の正の値を返します。
例
julia> floatmin(Float16)
Float16(6.104e-5)
julia> floatmin(Float32)
1.1754944f-38
julia> floatmin()
2.2250738585072014e-308
Base.floatmax ── 関数
floatmax(T=Float64)
浮動小数点数型 T で表現できる最大の有限の値を返します。
例
julia> floatmax(Float16)
Float16(6.55e4)
julia> floatmax(Float32)
3.4028235f38
julia> floatmax()
1.7976931348623157e308
Base.maxintfloat ── 関数
maxintfloat(T=Float64)
与えられた浮動小数点数型 T で浮動小数点数として正確に表現できる最大の整数値を返します。
言い換えると、maxintfloat が返すのは「n + 1 が型 T で正確に表せない」という条件を満たす正整数 n の中で最小のものを表す浮動小数点数です。
Integer 型の値が必要なときは Integer(maxintfloat(T)) としてください。
maxintfloat(T, S)
与えられた浮動小数点数型 T で表現できる連続する整数の中で、整数型 S の最大値を越さない最大値を返します。言い換えると、maxintfloat(T) と typemax(S) の小さい方を返します。
Base.eps ── メソッド
eps(::Type{T}) where T<:AbstractFloat
eps()
浮動小数点数型 T の計算機イプシロン (machine epsilon) を返します (デフォルトは T = Float64 です)。計算機イプシロンは「typeof(one(T)) で表現できる 1 の次に大きい値と 1 の差」として定義されます。この値は 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.0
Base.eps ── メソッド
eps(x::AbstractFloat)
x の最下位桁の単位 (unit in last place, ulp) を返します。ulp は x と次の浮動小数点数の間の距離と定義されます。x と両隣の浮動小数点数間の距離は多くの場合で異なるので、大きい方が ulp として採用されます。つまり次の等式が成り立ちます:
eps(x) == max(x-prevfloat(x), nextfloat(x)-x)
この規則の例外は浮動小数点数の最大および最小の有限値 (例えば Float64 では nextfloat(-Inf) と prevfloat(Inf)) です。この場合は小さい方の (有限の) 値が採用されます。
この振る舞いの理論的な根拠は、eps を使うと浮動小数点数の誤差を上から押さえられるという事実にあります。デフォルトの丸めモード RoundNearest を使うと、一般に実数 \(y\) と \(y\) に一番近い浮動小数点数 \(x\) に対して次の不等式が成り立ちます:
例
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.7976931348623157e308
Base.instances ── 関数
特殊な型
Core.Union ── 型
Union{Types...}
型共用体 (type union) は各引数の型のインスタンスを全て含む抽象型です。空の型共用体 Union{} は Julia の型システムにおけるボトム型です。
例
julia> IntOrString = Union{Int,AbstractString}
Union{Int64, AbstractString}
julia> 1 :: IntOrString
1
julia> "Hello!" :: IntOrString
"Hello!"
julia> 1.0 :: IntOrString
ERROR: TypeError: in typeassert, expected Union{Int64, AbstractString}, got a value of type Float64
Core.UnionAll ── 型
UnionAll
型パラメータが取り得るそれぞれの値に対する型の共用体を表す型です。UnionAll はパラメータの値がまだ知られていないパラメトリック型を表すのに使われます。
例
julia> typeof(Vector)
UnionAll
julia> typeof(Vector{Int})
DataType
Core.Tuple ── 型
Tuple{Types...}
タプルは関数の引数の抽象化です ──関数の処理は含まれません。関数の引数の最も重要な性質は順序と型です。そのためタプル型はパラメータ化された不変型であり、各パラメータが一つのフィールドの型を表します。タプルは好きなだけ多くのパラメータを持つことができます。
タプル型はパラメータの型に関して共変 (covariant) であり、例えば Tuple{Int} は Tuple{Any} の部分型です。そのため Tuple{Any} は抽象型とみなされ、タプル型はパラメータが全て具象型であるときだけ具象型となります。またタプルはフィールド名を持たず、フィールドには位置によってのみアクセスできます。
マニュアルのタプル型の節も参照してください。
Core.NamedTuple ── 型
NamedTuple
NamedTuple は、名前が示す通り、名前の付いた Tuple です。つまり NamedTuple は Tuple と同じく値のコレクションですが、それぞれのエントリーに Symbol で表されるユニークな名前が付いています。Tuple と同様 NamedTuple は不変です: 名前と値はどちらも構築した後に変更できません。
名前付きタプルにおける名前に関連付いた値へのアクセスは、フィールドアクセス構文 x.a または getindex (x[:a]) を使って行います。名前付きタプルの名前を集めたタプルは keys で取得でき、値を集めたタプルは values で取得できます。
NamedTuple に対して反復を行うと、名前を使わずに values だけを取り出せます (以下の例を参照)。名前と値の組に関して反復するには pairs 関数を使ってください。
@NamedTuple マクロを使うと NamedTuple 型を簡単に宣言できます。
例
julia> x = (a=1, b=2)
(a = 1, b = 2)
julia> x.a
1
julia> x[:a]
1
julia> keys(x)
(:a, :b)
julia> values(x)
(1, 2)
julia> collect(x)
2-element Array{Int64,1}:
1
2
julia> collect(pairs(x))
2-element Array{Pair{Symbol,Int64},1}:
:a => 1
:b => 2
キーワード引数の名前と値をプログラムから設定できるのと同じように、名前付きタプルはタプルリテラルの中に置いたセミコロンの後に name::Symbol => value という組を与えることでも作成できます。あるいは反復子を崩してこの形の組を作り、その組から名前付きタプルを作ることもできます:
julia> (; :a => 1)
(a = 1,)
julia> keys = (:a, :b, :c); values = (1, 2, 3);
julia> (; zip(keys, values)...)
(a = 1, b = 2, c = 3)
キーワード引数と同様に、セミコロンを使ったこの形のリテラルで識別子やドット式を使うと、エントリーの名前がそこから取り出されます:
julia> x = 0
0
julia> t = (; x)
(x = 0,)
julia> (; t.x)
(x = 0,)
名前付きタプルのリテラルで識別子とドット式から自動的に名前を取り出す機能は Julia 1.5 以降で利用できます。
Base.@NamedTuple ── マクロ
@NamedTuple{key1::Type1, key2::Type2, ...}
@NamedTuple begin key1::Type1; key2::Type2; ...; end
このマクロは NamedTuple 型を宣言する便利な構文を提供します。@NameTuple が返すのは与えられたキーと型を持つ NamedTuple{(:key1, :key2, ...), Tuple{Type1,Type2,...}} と等価な NamedTuple 型です。::Type の宣言を省略すると Any とみなされます。begin ... end の形式では型の宣言を複数行に分けて struct の宣言のように書くことができます。二つの書き方にそれ以外の違いはありません。
名前付きタプル (a=3.1, b="hello") は NamedTuple{(:a,:b), Tuple{Float64,String}} という型を持ちますが、@NamedTuple を使ってこの型を宣言するには次のようにします:
julia> @NamedTuple{a::Float64, b::String}
NamedTuple{(:a, :b),Tuple{Float64,String}}
julia> @NamedTuple begin
a::Float64
b::String
end
NamedTuple{(:a, :b),Tuple{Float64,String}}
このマクロは Julia 1.5 以降で利用できます。
Base.Val ── 型
Val(c)
実行時データを持たない値 Val{c}() を返します。c は isbits な値である必要があります。この種の型は値 c を通して関数の間で情報を受け渡すために利用できます。この構文を使うのは、定数に対して (コンパイル時に) 直接ディスパッチを行うことで実行時に定数の値を確認を省くためです。
例
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 ── 型
Vararg{T,N}
Tuple 型の最後のパラメータは任意個数の要素を表す特殊な型 Vararg とできます。Vararg{T, N} という型はちょうど N 個の T 型の要素に対応し、Vararg{T} という型はゼロ個以上の T 型の要素に対応します。Vararg を持つタプル型は可変長引数メソッドが受け取る引数を表します (詳細はマニュアルの可変長引数関数の節を参照してください)。
例
julia> mytupletype = Tuple{AbstractString,Vararg{Int}}
Tuple{AbstractString,Vararg{Int64,N} where N}
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)
false
Core.Nothing ── 型
Base.isnothing ── 関数
isnothing(x)
x === nothing なら true を返し、そうでないなら false を返します。
この関数は Julia 1.1 以降でサポートされます。
Base.something ── 関数
something(x, y...)
引数の中で nothing と等しくない最初の値を返します。もし引数が全て nothing ならエラーが発生します。Some 型の引数はアンラップされます。
coalesce も参照してください。
例
julia> something(nothing, 1)
1
julia> something(Some(1), nothing)
1
julia> something(missing, nothing)
missing
julia> something(nothing, nothing)
ERROR: ArgumentError: No value arguments present
Base.Enums.Enum ── 型
Base.Enums.@enum ── マクロ
@enum EnumName[::BaseType] value1[=x] value2[=y] ...
value1, value2, ... をメンバーに持つ EnumName という名前の列挙型 (Enum{BaseType} の部分型) を作成します。value1, value2, ... にはそれぞれ x, y, ... という値が割り当てられます。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
end
BaseType は Interger の部分プリミティブ型である必要があり、省略すると Int32 が使われます。メンバーの値は列挙体の型から BaseType への変換がサポートされ、read と wirte は変換を自動的に行います。
列挙体の全てのインスタンスを取得するには instances を使ってください:
julia> instances(Fruit)
(apple, orange, kiwi)
Core.Expr ── 型
Expr(head::Symbol, args...)
Julia コードのパース結果に含まれる複合式 (AST) を表す型です。それぞれの式は種別 (関数呼び出し・for ループ・条件式など) を表すシンボル head と、付随する部分式 (関数呼び出しの引数など) からなります。部分式は Vector{Any} 型のフィールド args に保存されます。
詳細はマニュアルのメタプログラミングの章および開発者向けドキュメントの Julia の AST を参照してください。
例
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 c
Core.Symbol ── 型
Symbol
Julia コードのパース結果 (AST) に含まれる識別子を表すオブジェクトの型です。何らかの要素を特定するためのラベル (例えば辞書のキー) としても使われます。Symbol はクオート演算子 : を使って入力します:
julia> :name
:name
julia> typeof(:name)
Symbol
julia> x = 42
42
julia> eval(:x)
42
コンストラクタ Symbol(x...) を使えば文字列などの値からも Symbol を構築できます。
Symbol は不変オブジェクトであり、比較は === を使って行うべきです。実装では同じ名前の Symbol が同じオブジェクトで表されるので、比較が高速に行えます (ポインタを比べれば済むため)。
文字列とは異なり、Symbol は "不可分" で "スカラー" な値なので、各文字に対する反復をサポートしません。
Core.Symbol ── メソッド
Core.Module ── 型
総称関数
Core.Function ── 型
Function
任意の関数を表す抽象型です。
例
julia> isa(+, Function)
true
julia> typeof(sin)
typeof(sin)
julia> ans <: Function
true
Base.hasmethod ── 関数
hasmethod(f, t::Type{<:Tuple}[, kwnames]; world=typemax(UInt)) -> Bool
総称関数 f のメソッドの中に、タプル t を引数として受け取ることができ、かつ世界時 world より前に定義されたものが存在するかどうかを判定します。
タプルのキーワード引数 kwnames が与えられると、t にマッチする f のメソッドが kwnames に含まれるキーワード引数を持つかどうかが判定されます。もしマッチするメソッドが可変長のキーワード引数を受け取る (;kwargs... などとなっている) なら、kwnames に含まれる任意の名前は正当とみなされます。それ以外の場合には、与えられた名前がメソッドのキーワード引数の部分集合である場合に限って true が返ります。
applicable も参照してください。
キーワード引数の名前を指定するには Julia 1.2 以降が必要です。
例
julia> hasmethod(length, Tuple{Array})
true
julia> hasmethod(sum, Tuple{Function, Array}, (:dims,))
true
julia> hasmethod(sum, Tuple{Function, Array}, (:apples, :bananas))
false
julia> g(; xs...) = 4;
julia> hasmethod(g, Tuple{}, (:a, :b, :c, :d)) # g は任意のキーワード引数を受け取る。
true
Core.applicable ── 関数
Core.invoke ── 関数
invoke(f, argtypes::Type, args...; kwargs...)
型 argtypes にマッチする総称関数 f のメソッドを、位置引数 args とキーワード引数 kwargs を渡して呼び出します。args の型は argtypes で指定した型と一致する必要があり、自動的な変換は行われません。このメソッドを使うと、最も特定的でないメソッドを呼び出すことが可能になります。この機能は一般的に定義される振る舞いが明示的に必要になったときに有用です (一般的なメソッドを持つ関数の特定的なメソッドの実装でよく使われます)。
自分が書いていない関数に対して invoke を使うときは注意が必要です。関数を特定の argtypes 型で呼び出すことがパブリックな API であることが明言されていない限り、与えられた argtypes に対して使われるメソッド定義は実装詳細です。例えば以下のコードで f1 と f2 は通常の (invoke を使わない) 呼び出しで区別できないので、通常は違いはないとみなされます。しかし invoke を使うと違った結果が得られます。
例
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)
Integer
Base.invokelatest ── 関数
invokelatest(f, args...; kwargs...)
f(args...; kwargs...) を呼び出します。invokelatest を使うと、最新の f のメソッドが呼ばれることが保証されます。これは関数が特殊化される状況、例えば長い間実行されるイベントループやコールバック関数で古い f の定義を呼び出される可能性がある状況で有用です (ただし欠点として、invokelatest は f を直接呼び出すよりもいくらか遅く、コンパイラは返り値の型を推論できません)。
new ── キーワード
Base.:∘ ── 関数
f ∘ g
関数を合成します。つまり (f ∘ g)(args...) は f(g(args...)) と等価です。記号 ∘ は REPL (および適切に設定されたその他のエディタ) で \circ<TAB> とタイプすれば入力できます。
関数の合成は前置形式でも行うことができ、∘(f, g) は f ∘ g と同じです。前置形式には複数の関数の合成をサポートするので、∘(f, g, h) = f ∘ g ∘ h が成り立ちます。さらに splat 演算子を使って ∘(fs...) とすれば関数の反復可能コレクションに含まれる関数を合成できます。
複数の関数の合成は Julia 1.4 以降でサポートされます。
一つの関数の合成 ∘(f) は Julia 1.5 以降でサポートされます。
例
julia> map(uppercase∘first, ["apple", "banana", "carrot"])
3-element Array{Char,1}:
'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> fs = [
x -> 2x
x -> x/2
x -> x-1
x -> x+1
];
julia> ∘(fs...)(3)
3.0
構文
Base.MainInclude.eval ── 関数
eval(expr)
この関数を持つモジュールのグローバルスコープで式 expr を評価します。(baremodule として定義されたモジュールを除く) 全てのモジュールは、受け取った式を自身のモジュールで評価する一変数の eval の定義をそれぞれ持ちます。
Base.@eval ── マクロ
Base.evalfile ── 関数
Base.@inbounds ── マクロ
@inbounds(blk)
式 blk 中で配列の境界検査を無効化します。
次の例では配列 A の i 番目の要素へアクセスするときの境界検査が飛ばされるので、性能が向上します:
function sum(A::AbstractArray)
r = zero(eltype(A))
for i = 1:length(A)
@inbounds r += A[i]
end
return r
end
@inbounds を使った式の中で境界外アクセスを行うと、正しくない結果が返ったり、プログラムのクラッシュやメモリの破壊が起きる可能性があります。境界外アクセスを起こらないことを手動で確認するのはユーザーの責任です。@inbounds は全てのアクセスが境界内であることがローカルで利用可能な情報から明らかな場合にだけ使ってください。
Base.@boundscheck ── マクロ
@boundscheck(blk)
式 blk に「この式は境界検査を行うブロックである」という注釈を付けます。この注釈が付いた式は @inbounds で削除されます。
@boundscheck ブロックを持つ関数を @inbounds 式から呼ぶとき、@inbounds が効果を持つ (呼び出した関数内の @boundscheck が削除される) には、その関数がインライン化される必要があります。
例
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 の部分型に対する添え字アクセスでは、境界検査で添え字を size と比較する処理を行います。そのため @boundscheck は getindex と setindex! の実装だけに、その振る舞いが正しいことを確認してから付けるべきです。
Base.@propagate_inbounds ── マクロ
Base.@inline ── マクロ
@inline
「この関数はインライン化した方がよい」というヒントをコンパイラに与えます。
通常コンパイラは小さい関数に対して自動的にインライン化を行うので、小さい関数に @inline は必要ありません。@inline を大きい関数に付けることで、それをインライン化するようコンパイラに促すことができます。次の例のように使います:
@inline function bigfunction(x)
#=
関数の定義
=#
end
Base.@noinline ── マクロ
@noinline
「この関数はインライン化しない方がよい」というヒントをコンパイラに与えます。
小さい関数は通常、自動的にインライン化されます。@noinline を小さい関数に使うことで、自動的なインライン化を抑止できます。次の例のように使います:
@noinline function smallfunction(x)
#=
Function Definition
=#
end
関数が自明 (例えば定数を返すだけ) だと、@noinline を付けてもインラインされて消える可能性があります。
Base.@nospecialize ── マクロ
@nospecialize
関数の引数の名前に適用され、コンパイラに「この引数の型に対しては特殊化を行わず、引数宣言に与えられた型をそのまま使うべきである」というヒントを与えます。これは過剰なコード生成を避けるための単なるヒントです。この注釈は関数の定義で使う引数リストの中で与えることも、関数本体で与えることもできます。引数リスト内で引数に適用するときは引数の式全体を @nospecialize で囲む必要があり、関数の本体で使うときは @nospecialize を最初の文にする必要があります。
@nospecialize を引数を付けずに使うと、親のスコープに含まれる全ての引数に適用されます。つまりローカルスコープでは @nospecialize を含む関数の全ての引数に適用され、グローバル (トップレベル) スコープでは現在のモジュールでこれから定義される全てのメソッドに適用されます。
@specialize を使うと特殊化の挙動を元に戻せます。
function example_function(@nospecialize x)
...
end
function example_function(@nospecialize(x = 1), y)
...
end
function example_function(x, y, z)
@nospecialize x y
...
end
@nospecialize
f(y) = [x for x in y]
@specialize
Base.@specialize ── マクロ
Base.gensym ── 関数
Base.@gensym ── マクロ
@gensym
与えられた名前を gensym に入力してシンボルを生成し、それを同名の変数に代入します。例えば @gensym x y は x = gensym("x"); y = gensym("y") に変換されます。
var"name" ── キーワード
var
var"#example#" という構文は #example# という名前の変数を表します。ただし #example# は Julia の識別子名としては正当ではありません。
この構文は構文や正当な識別子に関して Julia と異なる規則を持つプログラミング言語との相互運用で有用です。例えば R の変数 draw.segments を参照するときは、Julia コードからは var"draw.segments" を使います。
マクロの健全性処理を行った後の Julia ソースコードを show したときにも、このマクロは表れます。マクロ展開で追加される変数の名前は通常通りパースできないためです。
この構文を処理するにはパーサーが割って入る必要があることに注意してください。この構文はパーサーが直接展開しなければならないので、通常の文字列マクロ @var_str として実装することはできません。
この構文は Julia 1.3 以降でサポートされます。
Base.@goto ── マクロ
@goto name
@goto name は @label name の位置にある文へ無条件に制御を移動させます。
@label と @goto を使ってトップレベルの文へジャンプすることはできず、行うとエラーが発生します。どうしてもトップレベルで @goto を使いたいなら、@label と @goto をブロックで囲ってください。
Base.@label ── マクロ
Base.SimdLoop.@simd ── マクロ
@simd
通常より踏み込んだループ交換を行う許可をコンパイラに与える注釈を for ループに付けます。
この機能は実験的であり、将来のバージョンの Julia で変更/削除される可能性があります。間違った方法で @simd マクロを使うと予期せぬ結果が得られることがあります。
@simd for ループが反復するオブジェクトは一次元配列であるべきです。@simd を使うと、ループに関する次の性質が仮定されます:
- 縮約変数さえ考慮すれば、各反復を任意の順序で、互いに重なる形で実行して構わない。
- 縮約変数に対する浮動小数点数演算の順序は交換して構わない (これによって
@simdを使わないときと異なる結果となっても構わない)。
Julia は多くの場合で、@simd が無くても内側の for ループを自動的にベクトル化します。@simd を使うとコンパイラがベクトル化できるかを判断する条件を緩めることができ、ベクトル化が行える状況が増えます。両方の場合で、コンパイラによるベクトル化のためには内側のループに次の性質が必要です:
- そのループが最も内側のループである。
- ループの本体が直線的なコードである (条件分岐を全く持たない)。例えば現在の実装では配列へのアクセスには全て
@inboundsが付いている必要がある。&&,||,?:を使った短い式であれば、コンパイラがオペランドを無条件に評価しても安全であることを確認できるなら直線的なコードに変換できることがある。安全に変換できるときは?:ではなくifelseを使うことが推奨される。 - アクセスが "stride" パターンを持っている (隣り合う反復が定数だけ離れた読み書きを行う)。"gather" (ランダムな添え字からの読み込み) や "scatter" (ランダムな添え字への書き込み) は許されない。
- 歩長が一定 (unit stride) である。
ループの反復の間に存在するメモリの依存関係が存在しないことを、@simd はデフォルトで確認しません。この仮定は汎用なコードで簡単に破られます。汎用でないコードを書くときは、@simd ivdep for ... end を使えば次の事実を追加で表明 (成り立つものとして最適化を進めるようコンパイラに指示) できます:
- 反復をまたいだメモリの依存関係が存在しないこと。
- 実行を進めるために以前の反復を待つ必要がある反復が存在しないこと。
Base.@polly ── マクロ
Base.@generated ── マクロ
@generated f
@generated(f)
@generated は関数が後から生成される (被生成関数である) ことを示す注釈です。被生成関数の本体では、引数の型だけを読むことができます (値は読めません)。被生成関数はクオートされた式を返し、その式が関数が呼ばれたときに評価されます。グローバルスコープを変更する関数や可変要素に依存する関数に対しては @generated マクロを使用するべきではありません。
詳細はマニュアルの被生成関数の節を参照してください。
例
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.@pure ── マクロ
@pure ex
@pure(ex)
@pure は定義されている関数が純粋であることを示すヒントをコンパイラに与えます。これによって型推論の精度が向上する場合があります。
純粋関数が依存できるのは不変な情報だけです。これは @pure が付いた関数がグローバルな可変状態を利用できないことを意味します。利用できない状態には総称関数も含まれます。@pure は注意して使ってください。誤った使い方をすると、見つけるのが困難なバグが起こる可能性があります。特に総称関数を呼び出していないことの注意深い確認が必要です。このマクロはコンパイラ内部での利用が意図されており、将来変更される可能性があります。
Base.@deprecate ── マクロ
@deprecate old new [ex=true]
メソッド old を非推奨として、代替として new を指定します。ex と false にすると、old がエクスポートされなくなります。@deprecate は old と同じシグネチャを持つ新しいメソッドを定義します。
Julia 1.5 でコマンドライン引数 --depwarn のデフォルト値が no になったので、julia に --depwarn=yes を指定しないで起動すると @deprecate が定義する関数に対する警告が出力されません。Pkg.test() でテストを実行するときは警告が発生します。
例
julia> @deprecate old(x) new(x)
old (generic function with 1 method)
julia> @deprecate old(x) new(x) false
old (generic function with 1 method)
欠損値
Base.Missing ── 型
Base.missing ── 定数
Base.coalesce ── 関数
Base.ismissing ── 関数
Base.skipmissing ── 関数
skipmissing(itr)
itr の missing でない要素を反復する反復子を返します。itr が添え字アクセスをサポートするなら、skipmissing が返すオブジェクトには itr の添え字を使ってアクセスできます。itr の欠損値に対応する添え字は正当ではなく、keys と eachindex はその添え字を無視します。また欠損値を指す添え字を使うと MissingException が発生します。
itr に含まれる missing でない値からなる Array を取得するには collect を使ってください。なお itr が多次元配列であっても collect の返り値は Vector であることに注意が必要です。入力の次元を保ったままでは欠損値を取り除けないためです。
例
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 Array{Int64,1}:
1
3
julia> collect(skipmissing([1, missing, 2]))
2-element Array{Int64,1}:
1
2
julia> collect(skipmissing([1 missing; 2 missing]))
2-element Array{Int64,1}:
1
2
Base.nonmissingtype ── 関数
nonmissingtype(T::Type)
T が Missing を含む型共用体なら、Missing を削除した新しい型を返します。そうでなければ T を返します。
例
julia> nonmissingtype(Union{Int64,Missing})
Int64
julia> nonmissingtype(Any)
Any
この関数は Julia 1.3 以降でエクスポートされます。
システム
Base.run ── 関数
run(command, args...; wait::Bool = true)
バックティックで構築したコマンドオブジェクトを実行します。wait が true のときにプロセスが 0でない終了コードを返した場合など、何か上手く行かなければエラーが発生します (詳細はマニュアルの外部プログラムの実行の章を参照してください)。
wait が false だと、プロセスは非同期に実行されます。後でプロセスの終了を待って終了状態を取得するには、run が返すプロセスオブジェクトに対して success を呼んでください。
wait が false なら、プロセスの IO ストリームは devnull に転送されます。wait が true なら、IO ストリームは親プロセスと共有されます。IO リダイレクトの制御には pipeline が利用できます。
Base.devnull ── 定数
devnull
ストリームを devnull にリダイレクトすると、書き込まれたデータが全て捨てられます。本質的に Unix では /dev/null と等価であり、Windows では NUL と等価です。使用例を示します:
run(pipeline(`cat test.txt`, devnull))
Base.success ── 関数
success(command)
バックティックで構築したコマンドオブジェクトを実行し、それが成功 (終了コード 0 で終了) したかどうかを判定します (詳細はマニュアルの外部プログラムの実行の章を参照してください)。プロセスを開始できないときはエラーが発生します。
Base.process_running ── 関数
Base.process_exited ── 関数
Base.ignorestatus ── 関数
Base.detach ── 関数
detach(command)
コマンドを新しいプロセスグループで実行する印をコマンドオブジェクトに付けます。この印を付けたオブジェクトを実行するプロセスは Julia より長く生存し、Julia に対して Ctrl-C を送ってもそのプロセスには伝わらなくなります。
Base.Cmd ── 型
Cmd(cmd::Cmd; ignorestatus, detach, windows_verbatim, windows_hide, env, dir)
外部プログラムとその引数を表す Cmd オブジェクトを構築します。構築は cmd を使って行われ、省略可能なキーワード引数で設定が変更されます:
ignorestatus::Bool: もしtrueなら、Cmdが0でない終了コードで終了してもエラーが発生しなくなります。デフォルトはfalseです。detach::Bool: もしtrueなら、Cmdが新しいプロセスグループで実行されます。つまりCmdを実行するプロセスは Julia より長く生きられるようになり、Julia に対して Ctrl-C を送ってもそのプロセスには伝わりません。デフォルトはfalseです。windows_verbatim::Bool: もしtrueなら、Windows でCmdがプロセスに送るコマンドライン文字列に空白が含まれていたとしてもクオートやエスケープが行われなくなります。デフォルトはfalseです。Windows ではコマンドライン引数が単一の「コマンドライン文字列」としてプログラムに送られ、それを引数にパースするのはプログラムの責任となっています。デフォルトでは空白やタブを含む引数や空の引数は二重引用符"を使ってクオートされ、\と"には\でエスケープされます。windows_verbatim=trueは標準的でない方法でコマンドラインをパースするプログラムを起動するときに有用です。このキーワード引数は Windows 以外で意味を持ちません。windows_hide::Bool: もしtrueなら、Windows でCmdを実行するときに新しいコンソールウィンドウが表示されなくなります。コンソールが既に開いているとき、および Windows 以外のシステムでは効果を持ちません。デフォルトはfalseです。env:Cmdの実行中に設定される環境変数です。envは文字列から文字列への辞書か、"var=val"という形の文字列からなる配列か、"var"=>valという組からなるタプルまたは配列か、nothingのいずれかです。環境変数を全て置き換えるのではなく既存の環境変数を一部変更するには、copy(ENV)としてからenv["var"]=valとして変更したものをenvとして使ってください。dir::AbstractString: コマンドの作業ディレクトリを指定します (指定しなければカレントディレクトリが使われます)。
指定しないキーワードについては cmd が持つ設定が使われます。通常 cmd に渡す Cmd オブジェクトはバックティックを使って作成されます:
Cmd(`echo "Hello world"`, ignorestatus=true, detach=false)
Base.setenv ── 関数
setenv(command::Cmd, env; dir="")
与えられた command を実行するときに使うべき環境変数を設定します。env は文字列から文字列への辞書か、"var=val" という形の文字列からなる配列か、"var"=>val という組からなるタプルまたは配列か、nothing のいずれかです。環境変数を全て置き換えるのではなく既存の環境変数を一部変更するには、copy(ENV) としてから env["var"]=val として変更したものを env として使ってください。あるいは withenv を使うこともできます。
dir はコマンドの作業ディレクトリを指定します。
Base.withenv ── 関数
Base.pipeline ── メソッド
pipeline(from, to, ...)
前の要素からデータを読み、次の要素へデータを書き込むパイプラインを作成します。パイプラインの要素に指定できるのはコマンドまたは文字列、もしくは他の pipeline が返した値のいずれかであり、少なくとも一つはコマンドである必要があります。文字列はファイル名を表します。二つ以上の引数を与えて呼び出すと、各要素が左から右に連結します。例えば 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 ── メソッド
pipeline(command; stdin, stdout, stderr, append=false)
与えられた command が行う IO のリダイレクトを設定します。キーワード引数 stdin, stdout, stdout がコマンドが持つストリームのリダイレクト先を指定し、append がファイルへの出力が追記されるかどうかを制御します。これは二引数の pipeline 関数をより一般的にしたものです。例えば from がコマンドのときの pipeline(from, to) は 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 ── 関数
Base.Libc.getpid ── 関数
getpid(process) -> Int32
子プロセス process が存在するなら、そのプロセス ID を取得します。
この関数は Julia 1.1 以降でサポートされます。
Base.Libc.time ── メソッド
Base.time_ns ── 関数
Base.@time ── マクロ
@time
式を実行し、実行にかかった時間・メモリアロケートの回数・アロケートされたメモリの総量を出力し、式の値を返します。
@timev, @timed, @elapsed, @allocated も参照してください。
より本格的なベンチマークでは BenchmarkTools.jl パッケージの @btime マクロの利用を検討してください。@btime は関数を複数回実行してノイズを削減するといった処理を行います。
julia> @time rand(10^6);
0.001525 seconds (7 allocations: 7.630 MiB)
julia> @time begin
sleep(0.3)
1+1
end
0.301395 seconds (8 allocations: 336 bytes)
2
Base.@timev ── マクロ
@timev
詳細なバージョンの @time マクロです。@time と同じ情報に加えてメモリアロケートに関する様々なカウンターの中でゼロでない値を持つものを出力し、式の値を返します。
@time, @timed, @elapsed, @allocated も参照してください。
julia> @timev rand(10^6);
0.001006 seconds (7 allocations: 7.630 MiB)
elapsed time (ns): 1005567
bytes allocated: 8000256
pool allocs: 6
malloc() calls: 1
Base.@timed ── マクロ
@timed
式を実行し、式の値・かかった時間・アロケートされたメモリの総量・ガベージコレクションにかかった時間・メモリアロケートに関する様々なカウンターを持つオブジェクトを返します。
@time, @timev, @elapsed, @allocated も参照してください。
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 1.5 で Tuple から NamedTuple に変更されました。
Base.@elapsed ── マクロ
@elapsed
式を実行し、返り値を捨て、かかった秒数を浮動小数点数として返します。
@time, @timev, @timed, @allocated も参照してください。
julia> @elapsed sleep(0.3)
0.301391426
Base.EnvDict ── 型
Base.Sys.isunix ── 関数
Base.Sys.isapple ── 関数
Base.Sys.islinux ── 関数
Base.Sys.isbsd ── 関数
Base.Sys.isfreebsd ── 関数
Base.Sys.isopenbsd ── 関数
Base.Sys.isnetbsd ── 関数
Base.Sys.isdragonfly ── 関数
Base.Sys.iswindows ── 関数
Base.Sys.windows_version ── 関数
Sys.windows_version()
Windows NT Kernel のバージョン番号を v"major.minor.build" のような VersionNumber オブジェクトとして返します。Windows で実行していなければ v"0.0.0" が返ります。
Base.Sys.free_memory ── 関数
Base.Sys.total_memory ── 関数
Base.@static ── マクロ
@static
パース時に式を部分的に評価します。
例えば @static Sys.iswindows() ? foo : bar とすると Sys.iswindows() が評価され、foo または bar が現在の式に挿入されます。これは対応していないプラットフォームで存在しない関数に対する ccall などの不正な構文となってしまうときに利用できます。同様に @static if Sys.isapple() foo end や @static foo <&&,||> bar も正当な構文です。
バージョニング
Base.VersionNumber ── 型
VersionNumber
セマンティックバージョニングの仕様に従うバージョン番号を表す型です。メジャー番号・マイナー番号・パッチ番号を表す数値、およびそれに続くリリース前状態やビルド番号を表す英数字からなります。@v_str を参照してください。
例
julia> VersionNumber("1.2.3")
v"1.2.3"
julia> VersionNumber("2.0.1-rc1")
v"2.0.1-rc1"
Base.@v_str ── マクロ
@v_str
文字列をパースして VersionNumber を構築する文字列マクロです。
例
julia> v"1.2.3"
v"1.2.3"
julia> v"2.0.1-rc1"
v"2.0.1-rc1"
エラー
Base.error ── 関数
Core.throw ── 関数
Base.rethrow ── 関数
rethrow()
catch ブロックから現在処理しているのと同じ例外を送出します。
もう一つの rethrow(e) という形を使うと、代わりの例外オブジェクト e を現在のバックトレースに結び付けることができます。しかしエラーのタイミングにおけるプログラムの状態が不正確になるので、throw(e) として新しい例外を送出することが推奨されます。catch_stack で説明されるように、Julia 1.1 以降で throw(e) を使うと最初の例外が例外スタックに保存されます。
Base.backtrace ── 関数
Base.catch_backtrace ── 関数
Base.catch_stack ── 関数
catch_stack(task=current_task(); [inclue_bt=true])
現在処理中の例外スタックを取得します。ネストされた catch ブロックでは現在の例外が複数存在する場合がありますが、そのときは最も最近に発生した例外がスタックの最後に積まれます。スタックは基本的に (exception,backtrace) の組のベクトルとして返されますが、include_bt を false にすると例外だけのベクトルとなります。
明示的に task を渡すと任意のタスクの例外スタックを返します。これは捕捉されない例外によって終了したタスクを調査するときに有用です。
この関数は Julia 1.1 で追加された実験的な関数であり、おそらく将来のリリースで名前が変わります (参照: https://github.com/JuliaLang/julia/pull/29901)。
Base.@assert ── マクロ
@assert cond [text]
cond が false なら AssertionError を送出します。アサートを書くときに推奨される構文です。省略可能なメッセージ text を渡すと、アサートが失敗したときにそれが表示されます。
アサートは最適化レベルによって無効化される可能性があります。そのためアサートはデバッグツールとしてのみ使われるべきであり、認証 (パスワードの確認など) に使うべきではありません。また関数が正しく動作するために必要な副作用を持つ式をアサートの中に入れるのも厳禁です。
例
julia> @assert iseven(3) "3 is an odd number!"
ERROR: AssertionError: 3 is an odd number!
julia> @assert isodd(3) "What even are numbers?"
Base.Experimental.register_error_hint ── 関数
Experimental.register_error_hint(handler, exceptiontype)
エラーの対処方法をユーザーに示す "ヒント関数" として handler(io, exception) を登録します。handler は exception を調べてヒントを出すべき条件が成り立っているかどうかを判定し、もし成り立っているなら io にヒントを出力します。パッケージは __init__ 関数の中で register_error_hint を呼び出すべきです。
特定の例外型に対応する handler は追加の引数を受け付ける必要があります:
MethodError: メソッドに渡された位置引数の型とキーワード引数を受け取るhandler(io, exc::MethodError, argtypes, kwargs)を提供する。
ヒントを発するときは通常、出力を \n から始めるべきです。
独自の例外型でヒントをサポートするには、Experimental.show_error_hints をその型に対する showerror メソッドで呼んでください。
例
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, "\nDid you mean to call ")
printstyled(io, "`any_number`?", color=:cyan)
end
end
end
end
こうした上で Int でない値を Hinter.only_int に渡して MethodError を発生させると、ヒントが出力されます:
julia> Hinter.only_int(1.0)
ERROR: MethodError: no method matching only_int(::Float64)
Did you mean to call `any_number`?
Closest candidates are:
...
エラーに対するヒントのカスタマイズは Julia 1.5 以降で利用できます。
このインターフェースは実験的であり、予告なく変更または削除される可能性があります。変更が起こっても大丈夫なように、ヒント関数の登録は if isdefined(Base.Experimental, :register_error_hint) ... end というブロックで行うことを推奨します。
Base.Experimental.show_error_hints ── 関数
Experimental.show_error_hints(io, ex, args...)
特定の例外型 typeof(ex) に対して Experimental.register_error_hint で登録されたハンドラを全て起動します。args は typeof(ex) 型のハンドラが受け取る全ての引数を持つ必要があります。
エラーに対するヒントのカスタマイズは Julia 1.5 以降で利用できます。
このインターフェースは実験的であり、予告なく変更または削除される可能性があります。
Core.ArgumentError ── 型
Core.AssertionError ── 型
Core.BoundsError ── 型
BoundsError([a],[i])
配列 a に対する添え字アクセス演算が、境界外の要素を指す添え字 i に対するアクセスを試みたことを表すエラーの型です。
例
julia> A = fill(1.0, 7);
julia> A[8]
ERROR: BoundsError: attempt to access 7-element Array{Float64,1} at index [8]
Stacktrace:
[1] getindex(::Array{Float64,1}, ::Int64) at ./array.jl:660
[2] top-level scope
julia> B = fill(1.0, (2,3));
julia> B[2, 4]
ERROR: BoundsError: attempt to access 2×3 Array{Float64,2} at index [2, 4]
Stacktrace:
[1] getindex(::Array{Float64,2}, ::Int64, ::Int64) at ./array.jl:661
[2] top-level scope
julia> B[9]
ERROR: BoundsError: attempt to access 2×3 Array{Float64,2} at index [9]
Stacktrace:
[1] getindex(::Array{Float64,2}, ::Int64) at ./array.jl:660
[2] top-level scope
Core.DivideError ── 型
DivideError()
除数が 0 の除算が行われたことを表すエラーの型です。
例
julia> 2/0
Inf
julia> div(2, 0)
ERROR: DivideError: integer division error
Stacktrace:
[...]
Core.DomainError ── 型
DomainError(val)
DomainError(val, msg)
関数またはコンストラクタに対する引数 val が正しい範囲から外れていることを表すエラーの型です。
例
julia> sqrt(-1)
ERROR: DomainError with -1.0:
sqrt will only return a complex result if called with a complex argument. Try sqrt(Complex(x)).
Stacktrace:
[...]
Base.EOFError ── 型
Core.ErrorException ── 型
ErrorException(msg)
汎用的なエラーを表す型です。msg フィールドのエラーメッセージがエラーの詳細を提供します。
例
julia> ex = ErrorException("I've done a bad thing");
julia> ex.msg
"I've done a bad thing"
Core.InexactError ── 型
InexactError(name::Symbol, T, val)
関数 name のメソッドにおいて、val を正確に T 型へ変換できなかったことを表すエラーの型です。
例
julia> convert(Float64, 1+2im)
ERROR: InexactError: Float64(1 + 2im)
Stacktrace:
[...]
Core.InterruptException ── 型
InterruptException()
ターミナルからの割り込み (CTRL+C) によってプロセスが停止したことを表すエラーの型です。
-i オプション (対話モード) を付けずに開始した Julia スクリプトは InterruptException を送出しないのがデフォルトであることに注意してください。スクリプトで Base.exit_on_sigint(false) を呼び出せば REPL での振る舞いを復元できます。また Julia スクリプトを次のコマンドで起動する方法もあります:
julia -e "include(popfirst!(ARGS))" script.jl
こうすれば実行中のCTRL+C によって InterruptException を送出されるようになります。
Base.KeyError ── 型
KeyError(key)
AbstractDict (Dict) または Set に似たオブジェクトへの添え字アクセス演算が、存在しない要素に対するアクセスまたは削除を試みたことを表すエラーの型です。
Core.LoadError ── 型
Core.MethodError ── 型
Core.OverflowError ── 型
Base.ProcessFailedException ── 型
ProcessFailedException
プロセスが問題のある終了コードを持つことを表すエラーの型です。コマンドまたはパイプラインの実行では、ゼロでない終了コードが返ったとき (つまり起動されたプロセスが失敗したとき) にこの例外が送出されます。
Base.SystemError ── 型
SystemError(prefix::AbstractString, [errno::Int32])
失敗したシステムコールとそのエラーコード (グローバル変数 errno) の値を表すエラーの型です。
Core.TypeError ── 型
TypeError(func::Symbol, context::AbstractString, expected::Type, got)
型のアサートが失敗したこと、もしくは組み込み命令関数を間違った引数型で呼び出したことを表すエラーの型です。
Core.UndefKeywordError ── 型
UndefKeywordError(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]:1
Core.UndefRefError ── 型
UndefRefError()
要求された要素またはフィールドが指定されたオブジェクトに定義されていないことを表すエラーの型です。
例
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 ── 型
UndefVarError(var::Symbol)
シンボルが現在のスコープで定義されていないことを表すエラーの型です。
例
julia> a
ERROR: UndefVarError: a not defined
julia> a = 1;
julia> a
1
Core.InitError ── 型
InitError(mod::Symbol, error)
モジュールの __init__ 関数を実行しているときにエラーが起こったことを表すエラーの型です。発生した実際のエラーは error フィールドで確認できます。
Base.retry ── 関数
retry(f; delays=ExponentialBackOff(), check=nothing) -> Function
関数 f を呼び出す無名関数を返します。返り値の無名関数を通した f の実行中に例外が発生すると、delays で指定される秒数だけ待ってから f が繰り返し (最大 length(delays) 回) 呼び出されます。ただし例外が起きるたびに check 関数が現在状態と例外を引数として呼び出され、そこで false を返すと反復がそこで終了します (このとき例外は retry を呼び出した側に伝わります)。check 関数が (state, true) のタプルを返すと、state が次の check の呼び出しの第一引数 (現在状態) となります2。
Julia 1.2 以前では f::Function というシグネチャだけが利用できます。
例
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.Timer ── メソッド
Timer(callback::Function, delay; interval = 0)
タイマーを作成します。このタイマーは自身に対して wait するタスクを起動してから callback を呼び出す処理を定期的に行います。
タイマーに対して wait するタスクは最初 delay 秒だけ待たされてから起動され、その後は interval 秒ごとに起動されます。interval が 0 だと、タイマーは一度だけタスクを起動します。関数 callback はタイマーを唯一の引数として呼び出されます。タイマーを close で閉じると、そのタイマーを wait するタスクはエラーによって起動されます。タイマーが生きているかどうかは isopen で確認してください。
例
次の例では最初の 1 は二秒後に表示され、その次の 2 と 3 は素早く表示されます。
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
3
Base.Timer ── 型
Base.AsyncCondition ── メソッド
AsyncCondition(callback::Function)
指定した callback 関数を呼び出す非同期条件を作成します。callback は非同期条件を唯一の引数に受け取ります。
リフレクション
Base.nameof ── メソッド
Base.parentmodule ── 関数
parentmodule(m::Module) -> Module
Module を持つモジュールを取得します。Main の親は Main です。
例
julia> parentmodule(Main)
Main
julia> parentmodule(Base.Broadcast)
Base
parentmodule(t::DataType) -> Module
DataType の定義を持つモジュールを取得します。t は UnionAll でラップされていても構いません。
例
julia> module Foo
struct Int end
end
Foo
julia> parentmodule(Int)
Core
julia> parentmodule(Foo.Int)
Foo
Base.pathof ── メソッド
Base.moduleroot ── 関数
moduleroot(m::Module) -> Module
指定されたモジュールのルートモジュールを検索します。m のルートモジュールとは、m の親モジュールの中で最初に現れる登録されたルートモジュール、もしくは親が自身と等しいモジュールのことです。
Base.@__MODULE__ ── マクロ
Base.fullname ── 関数
fullname(m::Module)
完全に修飾されたモジュールの名前をシンボルのタプルとして取得します。
例
julia> fullname(Base.Iterators)
(:Base, :Iterators)
julia> fullname(Main)
(:Main,)
Base.names ── 関数
names(x::Module; all::Bool = false, imported::Bool = false)
モジュール x がエクスポートする名前からなる配列を返します。非推奨の名前は除外されます。all が true なら、モジュールで定義されるエクスポートされない名前・非推奨の名前・コンパイラによって生成される名前が返り値の配列に追加されます。imported が true なら、他のモジュールからインポートされた名前も明示的に追加されます。
Main で定義される名前は特別に全てエクスポートされるものとみなされます。普通 Main からは名前を明示的にエクスポートしないためです。
Core.nfields ── 関数
nfields(x) -> Int
オブジェクト x が持つフィールドの個数を取得します。
例
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 であり、二つのフィールドを持ちます。b は isbitstype なプリミティブ型 Int であり、フィールドを一つも持ちません。ex は ErrorException なので、フィールドを一つ持ちます。
Base.isconst ── 関数
Base.nameof ── メソッド
nameof(f::Function) -> Symbol
総称関数 f の名前をシンボルとして取得します。無名関数に対してはコンパイラが生成した名前が返り、明示的に宣言された Function の部分型に対しては関数の型の名前が返ります。
Base.functionloc ── メソッド
functionloc(f::Function, types)
型 types を引数に受け取る総称関数 f のメソッドが定義された位置を示すタプル (filename,line) を返します。
Base.functionloc ── メソッド
内部操作
Base.GC.gc ── 関数
GC.gc([full=true])
ガベージコレクションを実行します。引数 full はガベージコレクションの種類を指定します。デフォルトのフルコレクションは全てのオブジェクトをスイープするので、次の GC スキャンが非常に遅くなります。これに対して full を false にした場合のインクリメンタルなコレクションでは、いわゆる "若い" オブジェクトだけがスイープされます。
使い過ぎると性能が低下します。
Base.GC.enable ── 関数
GC.enable(on::Bool)
ガベージコレクションの有効/無効を切り替えます。真偽値の引数 on が true のとき有効となり、false のとき無効となります。以前の GC 状態を返します。
ガベージコレクションを無効化するとメモリ使用量が際限なく増えるので、無効化するときは注意が必要です。
Base.GC.@preserve ── マクロ
GC.@preserve x1 x2 ... xn expr
オブジェクト x1, x2, ... に使用中の印を付けた状態で式 expr を実行します。このマクロが必要になるのは、xi が持つメモリやリソースを expr 中の unsafe なコードが暗黙に使用するときだけです。
x が持つメモリやリソースの暗黙な使用とは、論理的には x が保有するデータをコンパイラから見えない形で使用することを言います。暗黙な使用の例を示します:
Ptrを通してxのメモリに直接アクセスする。xを指すポインタをccallに渡す。- ファイナライザで掃除されるはずの
xのリソースを使う。
@preserve はオブジェクトの寿命を少しだけ伸ばすだけなので、通常は性能に影響しないはずです。@preserve の実装は動的にアロケートされたオブジェクトをガベージコレクションから保護するといった処理を行います。
例
unsafe_load でポインタを読み込むとき、そのポインタが指すオブジェクトが暗黙に使用されます。例えば次のコードでは x が unsafe_load(p) によって暗黙に使用されています:
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
5
Base.GC.safepoint ── 関数
GC.safepoint()
ガベージコレクションの実行を許可する目印をプログラムに挿入します。これはマルチスレッドのプログラムでいくつかのスレッドがメモリをアロケートしており (つまり GC の実行が必要になる可能性があり)、他のスレッドが単純な処理 (アロケート・タスク切り替え・IO を行わない処理) をしているという稀な状況で利用できます。この関数をアロケートを行わないスレッドから定期的に呼び出せば、ガベージコレクションを実行させることができます。
この関数は Julia 1.4 以降でサポートされます。
Base.Meta.lower ── 関数
Base.Meta.@lower ── マクロ
Base.Meta.parse ── メソッド
parse(str, start; greedy=true, raise=true, depwarn=true)
式を表す文字列をパースして、式 (eval に渡して実行できるオブジェクト) と読み込んだ文字列の長さを返します。start はパースを開始する文字の添え字です。greedy が true (デフォルト値) だと、parse はできるだけ多くの入力を読もうとします。これに対して greedy が false だと、parse は正当な式を一つパースした時点で処理を止めます。不完全であるものの構文的には正当な文に対しては Expr(:incomplete, "(error message)") が返ります。raise が true だと、不完全な式以外の構文エラーはエラーを送出します。これに対して raise が false だと、構文エラーのとき「評価するとエラーが起こる式」が返るようになります。depwarn が false だと、非推奨の警告が出なくなります。
julia> Meta.parse("x = 3, y = 5", 7)
(:(y = 5), 13)
julia> Meta.parse("x = 3, y = 5", 5)
(:((3, y) = 5), 13)
Base.Meta.parse ── メソッド
parse(str; raise=true, depwarn=true)
式を表す文字列を貪欲にパースして、単一の式を返します。最初の式の後ろに余計な文字があった場合にはエラーを送出します。raise が true (デフォルト値) だと、構文エラーはエラーを送出します。これに対して raise が false だと、構文エラーのとき「評価するとエラーが起こる式」が返るようになります。depwarn が false だと、非推奨の警告が出なくなります。
julia> Meta.parse("x = 3")
:(x = 3)
julia> Meta.parse("x = ")
:($(Expr(:incomplete, "incomplete: premature end of input")))
julia> Meta.parse("1.0.2")
ERROR: Base.Meta.ParseError("invalid numeric constant \"1.0.\"")
Stacktrace:
[...]
julia> Meta.parse("1.0.2"; raise = false)
:($(Expr(:error, "invalid numeric constant \"1.0.\"")))
Base.Meta.ParseError ── 型
Core.QuoteNode ── 型
Base.macroexpand ── 関数
macroexpand(m::Module, x; recursive=true)
モジュール m で式 x を実行するとして、x に含まれるマクロを全て取り去った (展開した) 等価な式を返します。キーワード引数 recursive はネストされたマクロを展開するかどうかを制御します。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 ── マクロ
@macroexpand
式 x に含まれるマクロを全て取り去った (展開した) 等価な式を返します。
@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 ── マクロ
Base.code_lowered ── 関数
code_lowered(f, types; generated=true, debuginfo=:default)
与えられた総称関数と型シグネチャに適合するメソッドの低水準形式からなる配列を返します。
generated が false なら、返り値の配列に含まれる CodeInfo インスタンスはフォールバック実装に対応し3、フォールバック実装が存在しなければエラーが送出されます。generated が true なら、CodeInfo インスタンスは被生成関数を展開して得られるメソッドに対応します。
キーワード引数 debuginfo は出力に表示されるコードのメタデータの量を制御します。debuginfo に使える値は :source と :none です。
generated が true で対応するメソッドのいずれかが @generated メソッドのときは、types が葉型でないとエラーが発生することに注意してください。
Base.code_typed ── 関数
code_typed(f, types; optimize=true, debuginfo=:default)
与えられた総称関数と型シグネチャに適合するメソッドを表す、型が推論された低水準形式 (IR) の配列を返します。キーワード引数 optimize はインライン化などの追加の最適化を適用するかどうかを制御します。キーワード引数 debuginfo は出力に表示されるコードのメタデータの量を制御します。debuginfo に使える値は :source と :none です。
Base.precompile ── 関数
メタ操作
Base.Meta.quot ── 関数
Base.Meta.isexpr ── 関数
Meta.isexpr(ex, head[, n])::Bool
ex の head が引数 head に等しいこと、そして ex が n 個の引数を持つことを確認します。
例
julia> ex = :(f(x))
:(f(x))
julia> Meta.isexpr(ex, :block)
false
julia> Meta.isexpr(ex, :call)
true
julia> Meta.isexpr(ex, [:block, :call]) # head は :block または :call か?
true
julia> Meta.isexpr(ex, :call, 1)
false
julia> Meta.isexpr(ex, :call, 2)
true
Base.Meta.show_sexpr ── 関数
Meta.show_sexpr([io::IO,], ex)
式 ex を lisp の S-式のように表示します。
例
julia> Meta.show_sexpr(:(f(x, g(y,z))))
(:call, :f, :x, (:call, :g, :y, :z))
-
訳注: 「プロパティ」と「フィールド名」の違いについては What's the difference between fields and properties? に説明がある。[return]
-
訳注: 英語版の説明に
check関数の説明を追加した。[return]