Julia: ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ исходный ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· repl

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 20 ΠΌΠ°Ρ€. 2013  Β·  22ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: JuliaLang/julia

Π£ Π”ΠΆΡƒΠ»ΠΈΠΈ Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… REPL, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ methods ΠΈ help .
Однако ΠΌΠ½Π΅ всС Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠΆΠ½ΠΎ просто Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π° ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ‚.
Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ ΡƒΠΌΠ΅Ρ‚ΡŒ:

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 , каТСтся, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ строки ΠΊΠΎΠ΄Π° ΠΈΠ· Ρ„Π°ΠΉΠ»Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ просто.

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

МнС всС Π΅Ρ‰Π΅ каТСтся Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌ это

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

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ вСрсии ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ Π”ΠΆΡƒΠ»ΠΈΡŽ, ΡƒΠΌΠ΅Π΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ. Π― ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ это ΠΊΠ°ΠΊ «трСбуСтся ΠΏΠΎΠΌΠΎΡ‰ΡŒΒ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΆΠ΅Π»Π°Π½Π½Ρ‹ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΊ языку ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ исходноС прСдставлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, Π½ΠΎ Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Π½Π΅ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅.

ВсС 22 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Если Π±Ρ‹ ΠΌΡ‹ сохранили исходный (сТатый) источник ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ опрСдСлСния ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΡ€ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ запускС, это ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ довольно Π»Π΅Π³ΠΊΠΎ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° исходныС Ρ„Π°ΠΉΠ»Ρ‹ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ, ΠΈ Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° аннотация исходной строки Π½Π΅ совсСм идСальна. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ с # 265 (см. Π’Π°ΠΊΠΆΠ΅ это обсуТдСниС ), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ исходный ΠΊΠΎΠ΄ для пСрСкомпиляции. ВмСсто этого ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ AST Π² сТатом Π²ΠΈΠ΄Π΅ - ΡˆΠ΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΈΠ² ΠΏΠΎΠ»Π΄ΡŽΠΆΠΈΠ½Ρ‹.

НСт, с # 265 это Π½Π΅ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚. Π£ нас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ вся информация, просто ΠΎΠ½Π° большС Π½Π΅ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° исходный ΠΊΠΎΠ΄. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ исходный ΠΊΠΎΠ΄, Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°.

Π‘ΠΎΠ³Π»Π°ΡΠΈΡ‚Π΅ΡΡŒ с @JeffBezanson, ΠΈ это Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Ρ…ΠΎΠ΄ΠΎΠΌ ΠΎΡ‚ R, Π³Π΄Π΅ Π²Π²ΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π΅Π· скобок ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡŽ исходного ΠΊΠΎΠ΄Π°. Если исходный тСкст содСрТит Π±ΠΎΠ»Π΅Π΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… строк, ΠΎΠ½ становится Π½Π΅ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ΠΌ для использования (Π½Π΅Ρ‚ возмоТности ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ afaik).

+1 с Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ΠΌ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°.
Π›ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ https://github.com/JuliaLang/julia/issues/2594 , ΠΎΠ½ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ±ΠΈΠ²Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Windows, ΠΊΠΎΠ³Π΄Π° start - это собствСнная ΠΊΠΎΠΌΠ°Π½Π΄Π° cmd Π° notepad Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ синтаксис Π½ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ / ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Π½ΠΎΠΌΠ΅Ρ€Ρƒ строки.
edit - Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ полСзная функция, Ссли Π±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π΅Π΅ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ / ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ.

ΠŸΡ€ΠΎΡΡ‚ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Π΅ΡΡ‚ΡŒ Π»ΠΈ здСсь ΠΎΡ‰ΡƒΡ‰Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‰Π΅ΠΉ исходный ΠΊΠΎΠ΄ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π° скорСС ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° Β«Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅Β» для этой Ρ†Π΅Π»ΠΈ? Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π²Π΅Π±-записной ΠΊΠ½ΠΈΠΆΠΊΠΎΠΉ IPython, которая взаимодСйствуСт с ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ ядром Julia, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ» откроСтся Π½Π° машинС ядра, Π° Π½Π΅ Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅.

Как Π±Ρ‹ Ρ‚ΠΎ Π½ΠΈ Π±Ρ‹Π»ΠΎ, Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ€Π΅ΠΆΠΈΠΌΠ°Ρ… я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ исходный ΠΊΠΎΠ΄, Π° Π½Π΅ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ находится Π² Ρ„Π°ΠΉΠ»Π°Ρ…. Π― Ρ‚Π°ΠΊΠΆΠ΅ Ρ…ΠΎΡ‡Ρƒ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ исходный ΠΊΠΎΠ΄ Π²Π΅Ρ‰Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π²Π²Π΅Π΄Π΅Π½Ρ‹ Ρ‡Π΅Ρ€Π΅Π· repl. Π‘ΠΌ. Π’Π°ΠΊΠΆΠ΅ β„–3988.

ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΠ΅ΠΉΠ΄ΠΆΠ΅Ρ€Π° # 6921 ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ½ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ опасСния ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ полСзности этого.

Π― Π½Π°Ρ…ΠΎΠΆΡƒ это ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ Π² ipython (Ρ‡Π΅Ρ€Π΅Π· func?? ), хотя, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ julia, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ скрыты (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ / cython).

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, <strong i="5">@less</strong> func(x) ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎ выполняСт Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ @astrieanna (с Ρ€Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ΠΌ Π½Π° страницы), Π½ΠΎ это зависит ΠΎΡ‚ внСшнСго $PAGER .

<strong i="5">@less</strong> func(x) Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ для ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π½ΠΎ, ΠΏΠΎΡ…ΠΎΠΆΠ΅, это ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ слСдуСт ΠΏΠ΅Ρ€Π΅Ρ„Ρ€Π°Π·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ выпускС.

Если Π±Ρ‹ Π±Ρ‹Π»ΠΈ доступны Π΄Π²Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

  • ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° AST, Ρ‚.Π΅. исходный ΠΊΠΎΠ΄ ΠΈΠ· repl ΠΈΠ»ΠΈ Π²ΠΎ врСмя выполнСния
  • ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ / очистка ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… / Ρ‚ΠΈΠΏΠΎΠ² / Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ / Ρ‚ΠΈΠΏΠΎΠ²

Ρ‚ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ листинг / ΠΎΠ±Ρ…ΠΎΠ΄ / ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΡΡ†ΠΈΡŽ / Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ ΠΊΠΎΠ΄Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния.

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 ΠΏΡ€ΠΎΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π» 20 ΠΌΠ°Ρ€Ρ‚Π° 2013 Π³.
"НСт, с β„– 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 functions (ΠΈΠ· 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 соотвСтствуСт ΠΊΠ°ΠΊΠΎΠΌΡƒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρƒ. Π’ΠΎΠ³Π΄Π° Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ Ρ€Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Π² Yao, прСдоставлСнный https://github.com/MasonProtter/LegibleLambdas.jl

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π±Π»ΠΎΠΊ ΠΈΠΌΠ΅Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ количСства ΠΊΡƒΠ±ΠΈΡ‚ΠΎΠ², ΠΈ ΠΌΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ, поэтому ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ автоматичСски ΠΊΠ°Ρ€Ρ€ΠΈΡ€ΠΎΠ²Π°Π½, Ссли Π²Ρ‹ Π½Π΅ скармливаСтС это число, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€

julia> using Yao

julia> control(2, 1=>X)
(n -> control(n, 2, 1 => X gate))

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это Π½Π΅ Π±Π»ΠΎΠΊ, Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ это количСство ΠΊΡƒΠ±ΠΈΡ‚ΠΎΠ² для дальнСйшСй ΠΎΡ†Π΅Π½ΠΊΠΈ. Π”ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρƒ нас появятся LegibleLambdas, довольно слоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ просто число Π²Ρ€ΠΎΠ΄Π΅ #42 . Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ происходит с Flux, ΠΊΠΎΠ³Π΄Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Ρ€Π°Π½ΡŒΡˆΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»ΠΈ лямбду.

Но Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ³Π»ΠΎΠ²Ρ‹Ρ… случаСв, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π² LegibleLambdas, Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Ссли Π±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² 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

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ вСрсии ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ Π”ΠΆΡƒΠ»ΠΈΡŽ, ΡƒΠΌΠ΅Π΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ. Π― ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ это ΠΊΠ°ΠΊ «трСбуСтся ΠΏΠΎΠΌΠΎΡ‰ΡŒΒ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΆΠ΅Π»Π°Π½Π½Ρ‹ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΊ языку ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ исходноС прСдставлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, Π½ΠΎ Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² Π½Π΅ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅.

Аналогичная Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² https://github.com/timholy/CodeTracking.jl , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ Revise.jl. Π― Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΈΠ³Ρ€Π°Π» с Π½ΠΈΠΌ, ΠΈ хотя ΠΎΠ½ Π½Π΅ ΠΈΠ΄Π΅Π°Π»Π΅Π½, Ρ‡Π°Ρ‰Π΅ всСго ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ сказано, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ использовании Revise Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅.

Π­Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ Π² этом обсуТдСнии .

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ прСвосходно Π² сочСтании с автоматичСским Π΄ΠΈΡ„Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, https://github.com/FluxML/Zygote.jl), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡƒΡŽ ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ julia

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ