Julia์๋ methods
๋ฐ help
์ ๊ฐ์ ์ ์ฉํ REPL ํญ๋ชฉ์ด ๋ง์ด ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฌ์ ํ ์ฝ๋๊ฐ ๋ฌด์์ํ๋์ง๋ณด๊ธฐ ์ํด ์ฝ๋๋ฅผ ์ดํด ๋ด์ผํฉ๋๋ค.
๋ค์์ ์ํ ํ ์ ์์ผ๋ฉด ์ข์ ๊ฒ์
๋๋ค.
julia> methods(base)
# methods for generic function base
base(base::Integer,n::Integer,pad::Integer) at intfuncs.jl:290
base(symbols::Array{Uint8,N},n::Integer,p::Integer) at intfuncs.jl:291
base(base_or_symbols::Union(Integer,Array{Uint8,N}),n::Integer) at intfuncs.jl:292
julia> implementation(base,1)
base(base::Integer, n::Integer, pad::Integer) = _base(dig_syms,int(base),unsigned(abs(n)),pad,n<0)
julia> implementation(base,3)
base(base_or_symbols::Union(Integer,Array{Uint8}), n::Integer) = base(base_or_symbols, n, 1)
์ผ๋ถ IDE์ ์ฝ๋๋ก ์ด๋ํ๋ ๊ฒ๊ณผ ๋น์ทํ์ง๋ง REPL์์๋ ํ๋์ ๊ธฐ๋ฅ ๋ง ํ์ํฉ๋๋ค.
์คํฌ๋กค ์
ํ์ฌ _base
์ ๊ตฌํ์ ๋ณด๊ฑฐ๋ ํด๋น ํ์ผ์์ dig_syms
์ ์ ์๋ฅผ ๊ฒ์ ํ ์๋ ์์ง๋ง ๊ธฐ๋ณธ๊ฐ์ด ๋ฌด์์ธ์ง ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ ๋ถ๋ช
ํ ์ ํ์ด ์์ต๋๋ค. ์๋ฅด.
_base
์ ์๊ทธ๋์ฒ๋ฅผ ์ด๋ฏธ ๋ณผ ์ ์์ผ๋ฉฐ, ์ด๋ base
๊ตฌํ์๋ณด๋ค ์๋ฏธ์๊ฒ ๋ง๋ญ๋๋ค. (REPL์์ ํ
์คํธ ํธ์ง๊ธฐ๋ก ์ ํ ํ ํ์ ์์)
julia> methods(Base._base)
# methods for generic function _base
_base(symbols::Array{Uint8,N},b::Int32,x::Unsigned,pad::Int32,neg::Bool) at intfuncs.jl:278
์ค ๋ฒํธ / ํ์ผ์ด ์ด๋ฏธ methods
์ ์ถ๋ ฅ์ ํฌํจ๋์ด ์๋ค๋ ์ ์ ๊ณ ๋ คํ ๋ ํ์ผ์์ ์ ์ ํ ์ฝ๋ ์ค์ ๊ฐ์ ธ ์ค๋ ๊ฒ์ด ๊ฐ๋จํด์ผํฉ๋๋ค.
๋ํ ํ์ผ๋ก ์คํํ ๋ ๊ฐ ๋ฉ์๋ ์ ์์ ์์ค (์์ถ)๋ฅผ ์ ์ฅํ๋ฉด ์์ค ํ์ผ์ด ๋ณ๊ฒฝ๋๊ฑฐ๋ ์์ค ํ ์ฃผ์์ด ์๋ฒฝํ์ง ์์ ๊ฒฝ์ฐ์๋ ๋ค์ ์ฝ๊ฒ ์ํ๋๊ณ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ ํ ์ ์์ต๋๋ค. ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ ์ปดํ์ผ ํ ์ ์์ผ๋ฏ๋ก # 265 ( ์ด ํ ๋ก ์ฐธ์กฐ)์๋ ๋์
์๋์, # 265์๋ ๋์์ด๋์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฏธ ๋ชจ๋ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๋ ์ด์ ์์ค ์ฝ๋์ฒ๋ผ ๋ณด์ด์ง ์์ต๋๋ค. ์๋ณธ ์ฝ๋๋ฅผ๋ณด๊ณ ์ถ์ ๊ฒฝ์ฐ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ํ์ผ์์ ์ฝ๋ ๊ฒ์ ๋๋ค.
@JeffBezanson ๊ณผ ๋์ํ๋ฉด R์์ ๊ดํธ์์ด ํจ์๋ฅผ ์ ๋ ฅํ๋ฉด ์์ค ์ฝ๋๊ฐ ์ถ๋ ฅ๋์ง ์์ต๋๋ค. ์์ค์ ๊ธธ์ด๊ฐ ๋ช ์ค ์ด์์ด๋ฉด ์ฌ์ฉํ ์ ์๊ฒ๋ฉ๋๋ค (์ถ๋ ฅ afaik์ ์คํฌ๋กค ํ ๋ฐฉ๋ฒ์ด ์์).
+1 ํ์ผ์์ ์ฝ์.
๋ ๋์ ์์ https://github.com/JuliaLang/julia/issues/2594 , start
์ด ๊ธฐ๋ณธ cmd
๋ช
๋ น์ด๊ณ notepad
๊ฐ ๊ตฌ๋ฌธ์ ๊ฐ์กฐ ํ์ ํ ์์๋ ๊ฒฝ์ฐ ์ค์ ๋ก Windows ์ฌ์ฉ์๋ฅผ ์ฃฝ์
๋๋ค. ์ค ๋ฒํธ๋ก ํ์ / ์ ํํ์ง ์์ต๋๋ค.
edit
๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ๊ณ ์น๊ณ ๋ ์ข๊ฒ ๋ง๋ค ์ ์๋ค๋ฉด ์ ๋ง ์ ์ฉํ ํจ์์
๋๋ค.
์ดํดํ๊ธฐ ์ํด์, ๋ฉ์๋์ ์์ค ์ฝ๋๋ฅผ ๋ฐ์ํ๋ ํจ์๊ฐ ์๋๋ผ ๊ทธ ๋ชฉ์ ์ ์ํด 'ํธ์ง'์ ์์กดํด์ผํ๋ค๋ ๋๋์ด ์์ต๋๊น? ์๊ฒฉ Julia ์ปค๋๊ณผ ์ํธ ์์ฉํ๋ IPython ์น ๋ ธํธ๋ถ์์๋ ์ ์๋ํ์ง ์์ ์ ์์ต๋๋ค. ํ์ผ์ด ํด๋ผ์ด์ธํธ ๋์ ์ปค๋ ์ปดํจํฐ์์ ์ด๋ฆด ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋งํ ๊ฐ์น๊ฐ์๋ ๊ฒ์ ๋ํ ํ ๋ชจ๋์์ ํ์ผ์์๋ ๋ด์ฉ์ ์์กดํ๋ ๋์ ์์ค ์ฝ๋๋ฅผ ์ ์งํ๊ณ ์ถ์ต๋๋ค. repl์ ํตํด ์ ๋ ฅ ๋ ๊ฒ๋ค์ ์์ค ์ฝ๋๋ ๋ณผ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. # 3988๋ ์ฐธ์กฐํ์ญ์์ค.
ํธ์ถ๊ธฐ ์ง์ # 6921์ ์ด๊ฒ์ ์ ์ฉ์ฑ์ ๋ํ ์ผ๋ถ ์ฐ๋ ค๋ฅผ ๋ฌดํจํ ํ ์ ์์ต๋๋ค.
๋๋ (๋ฅผ ํตํด ipython์ด ๋งค์ฐ ํธ๋ฆฌ ์ฐพ์ ์ func??
์ค๋ฆฌ์์ ๊ฒฝ์ฐ๊ฐ ๋ ์๋ ๋ฌ๋ฆฌ - -ํ์ง๋ง,) ์ผ๋ถ ๊ธฐ๋ฅ (์ : ๋ด์ฅ / ์ฌ์ด ์ฌ ๊ธฐ๋ฅ) ์จ๊ฒจ์ ธ ์์ต๋๋ค.
๋ํ <strong i="5">@less</strong> func(x)
๋ @astrieanna ๊ฐ ์์ฒญํ๋ ์์
(ํ์ด์ง ํฌํจ)์ ๊ฑฐ์ ์ ํํ๊ฒ ์ํํ์ง๋ง ์ธ๋ถ $PAGER
์์กดํฉ๋๋ค.
<strong i="5">@less</strong> func(x)
๋ ๋ํ ํ ๊ธฐ๋ฅ์์ ์๋ํ์ง ์์ง๋ง ๋ค๋ฅธ ๋ฌธ์ ์์ ๋ค์ ํํํด์ผํ๋ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
๋ค์ ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์์๋ ๊ฒฝ์ฐ
๊ทธ๋ฐ ๋ค์ ๋ฐํ์ ์ฝ๋ ๋ชฉ๋ก / ์ํ / ์กฐ์ / ์์ฑ์ ์ํ ํ ์ ์์ต๋๋ค.
julia> q=:( function a(i::Int) ; return i+4 ; end ; b=4 ; println(a(b)) )
quote
function a(i::Int) # none, line 1:
return i + 4
end
begin
b = 4
println(a(b))
end
end
julia> function exprdescend(ex) ; if (isa(ex,Expr)) ; println("Descending Expr:",ex) ; println("head:",ex.head); println("args:",ex.args) ; println("type:",ex.typ) ; for i in ex.args ; exprdescend(i) ; end ; else ; println("*:",typeof(ex),":",ex) ; end ; end
// # ''try it ... long output''
๋๊ธ์ ๋ํ ์๋ต : JeffBezanson์ด 2013 ๋
3 ์ 20 ์ผ์ ๋๊ธ์ ๋ฌ์์ต๋๋ค.
"์๋์, # 265์์๋ ๋์์ด๋์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฏธ ๋ชจ๋ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง ๋ ์ด์ ์์ค ์ฝ๋์ฒ๋ผ ๋ณด์ด์ง ์์ต๋๋ค. ์๋ณธ ์ฝ๋๋ฅผ๋ณด๊ณ ์ถ๋ค๋ฉด ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ํ์ผ์์ ์ฝ๋ ๊ฒ์
๋๋ค. . "
๊ทธ๋์ ์ด๊ฒ์ด ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํ์ญ๋๊น? include / require ๋ฌธ ๋ฐ ๊ธฐํ ์ฌํญ์ด์๋ ๊ฒฝ์ฐ ์ด๋ป๊ฒ๋ฉ๋๊น?
// # str = read_whole_file_into_a_string(filename)
julia> str="for i in [1,2,3,4] ; println(i) ; end "
julia> s=parse(str)
:(for i = [1,2,3,4] # line 1:
println(i)
end)
julia> exprdescend(s)
Descending Expr:for i = [1,2,3,4] # line 1:
println(i)
end
head:for
args:{:(i = [1,2,3,4]),quote # line 1:
println(i)
end}
type:Any
Descending Expr:i = [1,2,3,4]
head:=
args:{:i,:([1,2,3,4])}
type:Any
*:Symbol:i
Descending Expr:[1,2,3,4]
head:vcat
args:{1,2,3,4}
type:Any
*:Int64:1
*:Int64:2
*:Int64:3
*:Int64:4
Descending Expr:begin # line 1:
println(i)
end
head:block
args:{:( # line 1:),:(println(i))}
type:Any
*:LineNumberNode: # line 1:
Descending Expr:println(i)
head:call
args:{:println,:i}
type:Any
*:Symbol:println
*:Symbol:i
@hgkamath ์ง๋ฌธ์ ์ดํดํ์ง ๋ชปํ๋ ๊ฒ ๋ฉํ ํ๋ก๊ทธ๋๋ฐ ๋ฐ ๋ฆฌํ๋ ์ ์น์ ์ ์ฝ์ผ์ญ์์ค.
๋ ๋ค๋ฅธ ์ฌ์ฉ ์ฌ๋ก๋ @generated
ํจ์ (https://groups.google.com/d/topic/julia-users/4pkWhcap1Zg/discussion)์
๋๋ค.
์, # 22007์์์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ๋์?
์ผ์ข ์ โ ๋๋ ์ฌ์ ํ REPL ๋ชจ๋์์ ์ฐ๋ฆฌ๊ฐ ํ์ ํ ๊ธฐ๋ฅ์ ์ํด ์๋ ์์ค๋ฅผ ์จ๊ฒจ์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ต๋ช ํจ์๋ฅผ ํ์ํ๋ ๋ฌธ์ ๋ ์๋๋ฐ, ์๋ AST๋ฅผ ํ์ ํ ์ ์์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
julia> x -> x+1
(::#5) (generic function with 1 method)
๋ณ๋ก ์ ์ฉํ์ง ์์ต๋๋ค. (๋ํ ๋ดํ ์ฐธ์กฐ.)
REPL ๋ชจ๋์์
์ฐ๋ฆฌ๋ ์ด๋ฏธ ๊ธฐ๋ณธ์ ์ผ๋กํ๊ณ ์์ต๋๋ค.
let h = Base.active_repl.interface.modes[1].hist,
replno = match(r"REPL\[(\d+)\]", $filename)
replno === nothing || h.history[h.start_idx + parse(Int, replno[1])]
end
"์ ๊ทผํ๊ธฐ ๊ท์ฐฎ์"== "ํด๊ฒฐ ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ ๋ ๋งํผ ์ ์ฉํ์ง ์์"
์ ์ฉ ํ ๊ฒ์์ ์ธ์ ํฉ๋๋ค. ํจ์๋ฅผ ์์ ํ๊ณ ์๋ก ๋ค๋ฅธ REPL์์ ์๋ก ๋ค๋ฅธ ๋ณํ์ ์คํํ์ฌ ๋น๊ตํ๋ ๋ฐฉ์์ผ๋ก ์์ฃผ ๋๋ฒ๊ทธํฉ๋๋ค. ๋๋๋ก ์ด๋ค REPL์ด ์ด๋ค ๋ณํ์ ํด๋นํ๋์ง ์ถ์ ํ์ง ๋ชปํฉ๋๋ค. ํ์ฌ ์ ์ ๋ ํจ์๋ฅผ ์ธ์ํ๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
https://github.com/MasonProtter/LegibleLambdas.jl ์์ ์ ๊ณตํ๋ Yao์ ์ฌ์ฉ ์ฌ๋ก
๋ชจ๋ ๋ธ๋ก์๋ ํ ๋นํธ ์์ ์ธ์๊ฐ ์์ผ๋ฉฐ ๋ฐ๋ณต์ ์ผ๋ก ์์ฑํ๊ณ ์ถ์ง ์์ผ๋ฏ๋ก์ด ์ซ์๋ฅผ ์ ๋ ฅํ์ง ์์ ๋ ์๋ ์ปค๋ฆฌ ๋ ์ ์์ต๋๋ค.
julia> using Yao
julia> control(2, 1=>X)
(n -> control(n, 2, 1 => X gate))
๋ฐ๋ผ์ ์ฌ์ฉ์๋ ์ด๊ฒ์ด ๋ธ๋ก์ด ์๋๋ผ๋ ๊ฒ์ ์ ์ ์์ผ๋ฉฐ ์ถ๊ฐ ํ๊ฐ๋ฅผ ์ํด์ด ํ ๋นํธ ์๊ฐ ํ์ํฉ๋๋ค. LegibleLambdas๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์๋ #42
์ ๊ฐ์ ์ซ์๋ง์ผ๋ก๋ ๋งค์ฐ ํผ๋ ์ค๋ฝ์ต๋๋ค. ์ด๊ฒ์ ์ต์ ํ ํ๋ก๊ทธ๋จ์ด ์ด์ ์ ๋๋ค๋ฅผ ๋ฐํ ํ ๋ Flux์๋ ๋ฐ์ํฉ๋๋ค.
๊ทธ๋ฌ๋ LegibleLambdas์์ ์ง์ํ ์์๋ ์ฝ๋ ์ผ์ด์ค๊ฐ ๋ง์ด ์์ต๋๋ค. extern ํจํค์ง ๋์ ์ปดํ์ผ๋ฌ์ ์ง์์ ํตํด REPL์์ ์ด๋ฌํ ์ ๋ณด๋ฅผ ์ง์ ๊ฐ์ ธ์ฌ ์ ์๋ค๋ ์ ์ด ์ข์ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์์ง์งํ๋ ๊ฒ์ด ์ฌ์ ํ ์ ์๊ฒ๋ ๋น๋ค์ด์ง ๊ฒ ๊ฐ์ต๋๋ค.
julia> <strong i="6">@code_native</strong> 1 + 2
.section __TEXT,__text,regular,pure_instructions
; โ @ int.jl:53 within `+'
leaq (%rdi,%rsi), %rax
retq
; โ
; โ @ int.jl:53 within `<invalid>'
nopw %cs:(%rax,%rax)
; โ
์ด
julia> <strong i="10">@code_llvm</strong> 1 + 2
; @ int.jl:53 within `+'
define i64 @"julia_+_13402"(i64, i64) {
top:
%2 = add i64 %1, %0
ret i64 %2
}
์ด
julia> <strong i="14">@code_typed</strong> 1 + 2
CodeInfo(
1 โ %1 = Base.add_int(x, y)::Int64
โโโ return %1
) => Int64
์ด
julia> <strong i="18">@code_lowered</strong> 1 + 2
CodeInfo(
1 โ %1 = Base.add_int(x, y)
โโโ return %1
)
ํ์ง๋ง ์ด๊ฑด ์๋์ผ
julia> <strong i="23">@code_source</strong> 1 + 2
ERROR: LoadError: UndefVarError: <strong i="24">@code_source</strong> not defined
in expression starting at REPL[23]:1
Julia๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ์ฌ๋์ด ์ฝ๊ณ ์ฐ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์๋ ๊ฒ์ ์ ์ธํ๊ณ ๊ฐ๋ฅํ ๋ชจ๋ ๋ฒ์ ์ ๋ฉ์๋๋ฅผ ๊ฒ์ฌ ํ ์ ์์ต๋๋ค. ํจ์์ ์์ค ํํ์ ๊ธฐ์ตํ๋ ์ ํ์ ๋ชจ๋๋ฅผ ๊ฐ๋ ๊ฒ์ด ์ธ์ด์ ํ์๋ฐ๋ ์ถ๊ฐ๋ผ๋ ๊ฒ์ ๋ํ ๋ด๊ธฐ ์ํด ์ด๊ฒ์ "๋์์ด ํ์ํจ"์ผ๋ก ํ์ ํ ๊ฒ์ ๋๋ค. ๋ํ ํ ๋ชจ๋์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ผ์ง ์ ์์ง๋ง ๋น๋ํ ํ ๋ชจ๋์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ์ ์์ต๋๋ค.
๋น์ทํ ๊ธฐ๋ฅ์ด ์ด์ Revise.jl์ ์ผ๋ถ์ธ https://github.com/timholy/CodeTracking.jl ์ ์ํด ๊ตฌํ๋ฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์กฐ๊ธ ๊ฐ์ง๊ณ ๋์๊ณ ์๋ฒฝํ์ง๋ ์์ง๋ง ๋ ์์ฃผ ์๋ํฉ๋๋ค. ์ค๋ช ์์๋ Revise๋ฅผ ์ฌ์ฉํ ๋ ํจ์ฌ ๋ ์ข์ต๋๋ค.
์ด๊ฒ์ ์ด ํ ๋ก ์์ ์ ์
์๋ ๋ฏธ๋ถ (์ : https://github.com/FluxML/Zygote.jl)๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋ฏธ๋ถ์ ์ค๋ฆฌ์ ์ฝ๋๋ก ํ์ ํ ์ ์์ผ๋ฏ๋ก์ด ๊ธฐ๋ฅ์ด ์ฐ์ ํ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์์ง์งํ๋ ๊ฒ์ด ์ฌ์ ํ ์ ์๊ฒ๋ ๋น๋ค์ด์ง ๊ฒ ๊ฐ์ต๋๋ค.
์ด
์ด
์ด
ํ์ง๋ง ์ด๊ฑด ์๋์ผ
Julia๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ์ฌ๋์ด ์ฝ๊ณ ์ฐ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์๋ ๊ฒ์ ์ ์ธํ๊ณ ๊ฐ๋ฅํ ๋ชจ๋ ๋ฒ์ ์ ๋ฉ์๋๋ฅผ ๊ฒ์ฌ ํ ์ ์์ต๋๋ค. ํจ์์ ์์ค ํํ์ ๊ธฐ์ตํ๋ ์ ํ์ ๋ชจ๋๋ฅผ ๊ฐ๋ ๊ฒ์ด ์ธ์ด์ ํ์๋ฐ๋ ์ถ๊ฐ๋ผ๋ ๊ฒ์ ๋ํ ๋ด๊ธฐ ์ํด ์ด๊ฒ์ "๋์์ด ํ์ํจ"์ผ๋ก ํ์ ํ ๊ฒ์ ๋๋ค. ๋ํ ํ ๋ชจ๋์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ผ์ง ์ ์์ง๋ง ๋น๋ํ ํ ๋ชจ๋์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ์ ์์ต๋๋ค.