Julia: ab ํ•„๋“œ ์•ก์„ธ์Šค ๊ตฌ๋ฌธ์˜ ์˜ค๋ฒ„๋กœ๋”ฉ ํ—ˆ์šฉ

์— ๋งŒ๋“  2013๋…„ 01์›” 10์ผ  ยท  249์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: JuliaLang/julia

์—ฌ๊ธฐ์— ํ‘œ์‹œ : https://github.com/JuliaLang/julia/issues/1263.

decision parser

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๊ฒƒ์— ๋Œ€ํ•œ ์žฌ๋ฏธ์žˆ๋Š” 3 ์ค„ ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

diff --git a/base/boot.jl b/base/boot.jl
index cd3ae8b..a58bb7e 100644
--- a/base/boot.jl
+++ b/base/boot.jl
@@ -266,6 +266,9 @@ Void() = nothing

 (::Type{Tuple{}})() = ()

+struct Field{name} end
+(::Field{f})(x) where {f} = getfield(x, f)
+
 struct VecElement{T}
     value::T
     VecElement{T}(value::T) where {T} = new(value) # disable converting constructor in Core
diff --git a/src/julia-syntax.scm b/src/julia-syntax.scm
index b4cb4b5..59c9762 100644
--- a/src/julia-syntax.scm
+++ b/src/julia-syntax.scm
@@ -1685,7 +1685,7 @@
     (if (and (pair? e) (eq? (car e) '|.|))
         (let ((f (cadr e)) (x (caddr e)))
           (if (or (eq? (car x) 'quote) (eq? (car x) 'inert) (eq? (car x) '$))
-              `(call (core getfield) ,f ,x)
+              `(call (new (call (core apply_type) (core Field) ,x)) ,f)
               (make-fuse f (cdr x))))
         (if (and (pair? e) (eq? (car e) 'call) (dotop? (cadr e)))
             (make-fuse (undotop (cadr e)) (cddr e))

๋‚ด ์ƒ๊ฐ์ด๋‹ค a.b ์‹ค์ œ๋กœ ํ”„๋กœ์ ์…˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค Field{:b}() ๋Œ€์‹  getfield ์ด ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์–ป์„ ๊ทธ๋ž˜์„œ, x->x.a ๋ฌด๋ฃŒ ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ getfield ๋Š” ํ•ญ์ƒ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ํ•„๋“œ ์•ก์„ธ์Šค๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ๊ตฌํ˜„์€ ์™„์ „ํžˆ ์ž‘๋™ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ๋Š” ์ƒ๋‹นํžˆ ์–ด๋ ต์Šต๋‹ˆ๋‹ค (sysimg + 5 %, ์ •๋ง ์ฆ๊ฑฐ์šด ๋†€๋ผ์›€์ž…๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ ์ด๊ฒƒ์€ ๋ช‡ ๊ฐ€์ง€ ์ „๋ฌธํ™” ํœด๋ฆฌ์Šคํ‹ฑ์ด ํ•„์š”ํ•˜๊ณ  ์ดˆ๊ธฐ ์ตœ์ ํ™”๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ๋˜๋ฉด ์‹คํ–‰ ๊ฐ€๋Šฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  249 ๋Œ“๊ธ€

mutator / accessor ๋ฉ”์„œ๋“œ์˜ ๊ตฌ๋ฌธ ์„คํƒ•์œผ๋กœ ์ ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์€ ๋งŽ์€ ์ผ์— ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. API๋ฅผ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ  ๊ตฌ์กฐ ํ•„๋“œ๋ฅผ ๋” ๋ณต์žกํ•œ ์ถ”์ƒํ™”๋กœ ์ „ํ™˜ ํ•  ์ˆ˜ ์žˆ๋„๋ก์ด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์–ธ์–ด๋กœ ํ•ญ์ƒ ๊ฐ์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

+1

๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ์ ˆ๋Œ€์ ์œผ๋กœ ๋ฉ‹์ง„ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š”์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ์ง€ํ˜œ์— ์ ์  ๋” ํšŒ์˜์ ์ด์ง€๋งŒ, Tom Short๊ฐ€ DataFrames์— ์ด๊ฒƒ์„ ๊ฐ–๋Š” ๊ฒƒ์— ์ •๋ง๋กœ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋‚ด๊ฐ€ ํ•  ์ˆ˜ ๋ฐ–์—์žˆ์–ด ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ (PyCall๋ฅผ ํ†ตํ•ด) ํŒŒ์ด์ฌ ์ฝ”๋“œ ์ƒ๋‹นํžˆ ์ข‹๋„ค์š”๋ฅผ ํ˜ธ์ถœ ํ•  ๊ฒƒ a[:b] ๋Œ€์‹  a.b .

@JeffBezanson , 0.3์„ ์œ„ํ•ด ์ด๊ฒƒ์„ ๊ฐ€์งˆ ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? PyCall๊ณผ JavaCall (cc @aviks) ๋ชจ๋‘ ์–ธ์–ด ๊ฐ„ ์ƒํ˜ธ ์šด์šฉ์„ฑ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

@JeffBezanson if _not_, ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜๊ธฐ๋ฅผ ์›ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ฐฉํ–ฅ์„ ์ œ์‹œ ํ•  ์ˆ˜์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ( I have an absolutely awesome way to implement this. )

๋‚ด ๊ฒฝํ—˜์ƒ Jeff๊ฐ€ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ๋ฒ„์ „์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค Jeff๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋กํ•˜๋Š” ๋” ๋น ๋ฅด๊ณ  ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค ;-)

๊ธฐ๋ณธ ์•„์ด๋””์–ด๋Š”

getfield(x::MyType, ::Field{:name}) = ...

ํ•„๋“œ ๋‹น ์˜ค๋ฒ„๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด "์‹ค์ œ"ํ•„๋“œ์— ์•ก์„ธ์Šคํ•˜์—ฌ ํˆฌ๋ช…ํ•˜๊ฒŒ ์ž‘์—… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ๋Œ€์ฒด๋กœ getfield(::MyType, ::Symbol) ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ๋ชจ๋“ˆ์ด . ๊ณผ ๊ด€๋ จํ•˜์—ฌ ํŠน๋ณ„ํ•œ ๋™์ž‘์„ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ก ์ ์œผ๋กœ ์ด๊ฒƒ์€ getfield ์˜ ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ• ์ผ ๋ฟ์ด์ง€ ๋งŒ ๋ฌธ์ œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์—ญ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“ˆ ์ฐธ์กฐ _earlier_๋ฅผ ํ•ด๊ฒฐํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. . ์˜ ๋™์ž‘์—์„œ ์ด๊ฒƒ์„ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋กœ ์œ ์ง€ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (# ์œ ํ˜•) * (# ํ•„๋“œ) ์ถ”๊ฐ€ ํ•จ์ˆ˜ ์ •์˜๋ฅผ ๋ถ„์„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„์˜ ์ปดํŒŒ์ผ๋Ÿฌ ํšจ์œจ์„ฑ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์„ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@JeffBezanson ๋ชจ๋“ˆ์—์„œ const ๋™์ž‘๋„ ์ฐธ์กฐํ•ฉ๋‹ˆ๊นŒ? ๋ชจ๋“ˆ์„ ์—๋ฎฌ๋ ˆ์ดํŠธํ•˜๋Š” ์‚ฌ์šฉ์ž ์œ ํ˜•์„ ๊ฐ–๊ณ  ๋™์  ํ•„๋“œ ์กฐํšŒ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์‚ฌ์‹ค ์ƒ์ˆ˜ ์ผ ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ์— ์•Œ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฉด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. (๋˜ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์‹ค์ œ ๋ชจ๋“ˆ๋กœ ์‹œ์ž‘ํ•˜์—ฌ ์‹คํŒจํ•œ jl_get_global ๋ฅผ "ํŠธ๋žฉ"ํ•˜๊ณ  ์š”์ฒญ์‹œ ์ƒˆ ๋ฐ”์ธ๋”ฉ์„ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

# 5395์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ •์˜๋˜์ง€ ์•Š์€ ํ•จ์ˆ˜ ๋˜๋Š” ๋ฉ”์„œ๋“œ MyMod.newfunction(new signature) ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ๊ฐ€๋กœ ์ฑ„๊ณ  ์š”์ฒญ์‹œ (์•„๋งˆ๋„ ํฐ) API์— ๋Œ€ํ•œ ๋ฐ”์ธ๋”ฉ์„ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์ถ”์ธกํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ const ๋ฐ”์ธ๋”ฉ์œผ๋กœ ์บ์‹œ๋ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ Julia ์ดˆ๋ณด์ž ์ธ ์ œ๊ฐ€ ์•ฝ๊ฐ„์˜ ์šฐ๋ ค๋ฅผ ํ‘œํ•ฉ๋‹ˆ๋‹ค. ์  ์—ฐ์‚ฐ์ž์— ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆด ๊ฐ€๋Šฅ์„ฑ์ด ํ•„๋“œ ์•ก์„ธ์Šค "์ˆœ์ˆ˜์„ฑ"์ด ์–ด๋–ป๊ฒŒ ๋“  ์†์‹ค๋˜์—ˆ์Œ์„ ์˜๋ฏธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ab๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ฐธ์กฐ / ๊ฐ’์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ์ผ ๋ฟ์ด๊ฑฐ๋‚˜ ๋’ค์— ํ˜ธ์ถœ๋˜๋Š” ๊ฑฐ๋Œ€ํ•œ ํ•จ์ˆ˜ ๊ธฐ๊ณ„๊ฐ€์žˆ์„ ์ˆ˜์žˆ๋Š” ๊ฒฝ์šฐ ์ง€์‹์„ ์žƒ๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์–ด๋–ป๊ฒŒ ๋‚˜์  ์ˆ˜ ์žˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ๊ทธ์ € ๋Š๋‚Œ ์ผ๋ฟ ...

๋‹ค๋ฅธ ํ•œํŽธ์œผ๋กœ, ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋งŽ์€ ๊ฒฝ์šฐ (PyCall, Dataframes ...)์— ๋Œ€ํ•œ ์‹ ํƒ์Šค ์Šˆ๊ฐ€์— ๋Œ€ํ•œ ํฐ ๋ฐ”๋žŒ์ด๋ฉฐ, ์ด๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์–ด์ฉŒ๋ฉด .. # 2614?

๋‚˜๋Š” ์ด๊ฒƒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ˆœ๋„๋Š” ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” ๊ฒฝ์šฐ์—๋„, ๊ทธ๊ฒƒ์„ ํ•  ๋ง์ด ์žˆ๋‚˜์š” names(Foo) ์˜ ์‹ค์ œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์•Œ์•„๋‚ผ Foo ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆœ์ˆ˜์„ฑ ์ฃผ์žฅ์€ ๋‚ด๊ฐ€ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ์ฃผ์š” ์‹ค์งˆ์ ์ธ ๊ด€์‹ฌ์‚ฌ์™€ ๋ฐ€์ ‘ํ•œ ๊ด€๋ จ์ด ์žˆ๋Š”๋ฐ, ์ด๋Š” ์œ ํ˜•์˜ ํ•„๋“œ๊ฐ€ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์ด๋ฆ„์„ ๋ฐฉํ•ด ํ•  ๋•Œ ์ด๋ฆ„ ์ถฉ๋Œ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. DataFrames์—์„œ๋Š” ์—ด ์ด๋ฆ„์œผ๋กœ columns ๋ฐ colindex ์‚ฌ์šฉ์„ ๊ธˆ์ง€ํ•จ์œผ๋กœ์จ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์˜ ๊ณ„ํš์ด ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

MyType ํ•„๋“œ์— foo ํ•„๋“œ๊ฐ€์žˆ์„ ๋•Œ getfield(x::MyType, ::Field{:foo}) = ... ์ด (๊ฐ€) ๊ธˆ์ง€๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‹ค์ œ ํ•„๋“œ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๊ฐ€ ์†์‹ค๋ฉ๋‹ˆ๋‹ค (๋˜๋Š” ํ•„๋“œ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ๊ฐ•์ œํ•˜๋Š” ๋ฐฉ๋ฒ•). ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค).
๊ทธ๋Ÿฌ๋‚˜ ์ถ”์ƒ ์œ ํ˜•์€ ํ•„๋“œ์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— getfield ๋Š” ๊ตฌ์ฒด์ ์ธ ์œ ํ˜•์— ๋Œ€ํ•ด์„œ๋งŒ ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(๊ทธ๋™์•ˆ C ++์— ๋Œ€ํ•ด ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.)

ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์‹ค์ œ ํ•„๋“œ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•ด Core.getfield(x, :f) ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ข‹์•„, ๋‚ด๊ฐ€ ํŒ”๋ ธ์„์ง€๋„ ๋ชฐ๋ผ. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐ”๋กœ ๊ฐ€๊ธฐ ์ •์˜ Core.getfield(x, :f) (์˜ˆ๋ฅผ ๋“ค์–ด, x..f ์˜ค๋ฒ„๋กœ๋“œ ์œ ํ˜•์˜ ๋‹ค๋ฅธ ๋‚ด๋ถ€ ์ฝ”๋“œ)์ž…๋‹ˆ๋‹ค ์ข‹์€์„ . ๋ชจ๋“  ๊ธฐํ˜ธ (dataframes, ์•„๋งˆ ์‚ฌ์ „)์— ๋Œ€ํ•œ์— ์žˆ์Šต๋‹ˆ๋‹ค Core.getfield s๋กœ ๋ถ ๋น•๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ˆœ์ˆ˜์„ฑ ์ธก๋ฉด์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํ•„๋“œ ์•ก์„ธ์Šค๋ฅผ ์ „ํ˜€ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๊ฒƒ์€
์ฃผ์–ด์ง„ ์œ ํ˜•์˜ ๊ตฌํ˜„. ํ•„๋“œ ์•ก์„ธ์Šค๊ฐ€ API์˜ ์ผ๋ถ€์ธ ๊ฒฝ์šฐ
๋ชจ๋“  API์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฌธ์„œํ™”ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํŽธ๋ฆฌ ํ•  ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
core.getfield์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋‹จ์ถ•ํ‚ค ๊ตฌ๋ฌธ์„ ์ž‘์„ฑํ•  ๋•Œ
๊ตฌํ˜„.

์ด๋ฏธ # 4935์—์„œ ์ง€์ ๋˜์—ˆ์ง€๋งŒ ์—ฌ๊ธฐ๋กœ ๋‹น๊ฒจ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์  ์˜ค๋ฒ„๋กœ๋”ฉ์€ ์ œ๋Œ€๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ์กด Julian ๋‹ค์ค‘ ๋””์ŠคํŒจ์น˜์™€ ์•ฝ๊ฐ„ ๊ฒน์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

getfield (x :: MyType, :: Field {: size}) = .........
for i = 1 : y.size .....

๋Œ€์‹ ์—

size (x :: MyType) = ..........
for i = 1 : size (y) ....

์ ์€ ์ปฌ๋ ‰์…˜ (Dataframes, Dicts, PyObjects)์˜ ํ•ญ๋ชฉ์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜์ง€๋งŒ ํ•„๋“œ๊ฐ€ ์•„๋‹Œ ๊ฐœ์ฒด ์†์„ฑ์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ๊ณ ๋ คํ•  ์‚ฌํ•ญ์€ ์ ‘๊ทผํ•˜๋Š” ํ•„๋“œ์— ๊ณผ๋ถ€ํ•˜๋ฅผ ๊ฑธ ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ•„๋“œ์— _setting_ ๊ณผ๋ถ€ํ•˜๋ฅผ ๊ฑธ ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ผ๊ด€์„ฑ์ด์—†๊ณ  ์‹ค๋ง ์Šค๋Ÿฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋ฉ€๋ฆฌ ๊ฐ€๋„๋ฉ๋‹ˆ๊นŒ?

@nalimilan , getfield ์™ธ์— setfield! ๊ฐ€ ์ ˆ๋Œ€์ ์œผ๋กœ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. (์œ ์‚ฌ setindex! ๋Œ€ getindex ๋Œ€ํ•œ [] ). ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@stevengj ๋™์˜ : DataFrames๋Š” ํ™•์‹คํžˆ ์—ด์— ๋Œ€ํ•ด setfield! ๋ฅผ ๊ตฌํ˜„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„์ง€์ง€ํ•œ๋‹ค.

๋‹ค๋ฅธ ์–ธ์–ด (์˜ˆ : C # ๋ฐ Python)์— ๋Œ€ํ•œ ๊ฒฝํ—˜์€ ๋„ํŠธ ๊ตฌ๋ฌธ์ด ๋งŽ์€ ์‹ค์šฉ์ ์ธ ๊ฐ€์น˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํŠน์ˆ˜ํ•œ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ์‹์€ ์ฃผ๋กœ ์„ฑ๋Šฅ ํšŒ๊ท€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ฉ”์„œ๋“œ์˜ _inlineability_๊ฐ€์ด ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์‹ฌ๊ฐํ•˜๊ฒŒ ์˜ํ–ฅ์„๋ฐ›์ง€ ์•Š๋„๋กํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด f(x) = g(x.a) + h(x.b) ์™€ ๊ฐ™์€ ํ•ญ๋ชฉ์€์ด ์ฐฉ๋ฅ™ ํ›„ ๊ฐ‘์ž๊ธฐ ์ธ๋ผ์ธ ํ•ด์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์†์„ฑ์„ ๋” ์‰ฝ๊ฒŒ ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งคํฌ๋กœ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋„ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

# let A be a type, and foo a property name
<strong i="10">@property</strong> (a::A).foo = begin
    # compute the return the property value
end

# for simpler cases, this can be simplified to
<strong i="11">@property</strong> (a::A).foo2 = (2 * a.foo)

# set property 
<strong i="12">@setproperty</strong> (a::A).foo v::V begin
    # codes for setting value v to a property a.foo
end

์ด๋ฉด์—์„œ์ด ๋ชจ๋“  ๊ฒƒ์ด ๋ฉ”์„œ๋“œ ์ •์˜๋กœ ๋ณ€ํ™˜ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<strong i="5">@property</strong> (a::A).foo = ์ด getproperty(a::A, ::Field{foo}) = ๋ณด๋‹ค ํ›จ์”ฌ ์‰ฝ๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ...

์–ด์จŒ๋“  ๋” ๋‚˜์€ ๊ตฌ๋ฌธ ์„คํƒ•์€ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์ด ๋๋‚œ ํ›„์— ์ถ”๊ฐ€ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ธ๋ผ์ธ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ฃผ๋ณ€ ๊ธฐ๋Šฅ์„ ์ธ๋ผ์ธํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์ „์— ํ•„๋“œ ์•ก์„ธ์Šค๊ฐ€ ์ธ๋ผ์ธ๋˜๋Š” ํ•œ ์™œ ์˜ํ–ฅ์„ ๋ฐ›๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ํ˜„์žฌ ์ธ๋ผ์ธ์ด ์ˆ˜ํ–‰๋˜๋Š” ์ˆœ์„œ๊ฐ€ ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝœ๋ก ์ด ๋„ˆ๋ฌด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— getproperty(a::A, ::Field{:foo}) = ๊ฐ€ ๋‚˜์—๊ฒŒ ์ถฉ๊ฒฉ์„์ค๋‹ˆ๋‹ค. :-) ์ €๋Š” ์ด๊ฒƒ์ด ์‚ฌ์†Œํ•œ ์ผ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜๋ฉฐ ์•„๋งˆ๋„ ์ง€๊ธˆ ๋‹น์žฅ ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด ๊ด€์‹ฌ์‚ฌ๋Š” ์ด๊ฒƒ์ด ์„ฑ๋Šฅ ํšŒ๊ท€๋ฅผ ์œ ๋ฐœํ•˜๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ์ฝ”๋“œ ์ƒ์„ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. @JeffBezanson ์•„๋งˆ๋„ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋ญ”๊ฐ€ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ•„๋“œ ์•ก์„ธ์Šค๋Š” ๋งค์šฐ ๋‚ฎ์€ ์ˆ˜์ค€์ด๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ์œ ์ง€๋˜๋Š”์ง€ ํ™•์ธํ•˜์ง€ ์•Š๊ณ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ํ•„๋“œ๋ฅผ ์˜ค๋ฒ„๋กœ๋”ฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ด๋ผ๊ณ  ํ™•์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์—๋Š” ํ•ญ์ƒ x.property = value ๋ฐ property!(x, value) ๋‘ ๊ฐ€์ง€ ์†์„ฑ ์„ค์ • ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ์ด ๊ตฌํ˜„๋˜๋ฉด ์ €์ž๊ฐ€ ์ฃผ์–ด์ง„ ์œ ํ˜•์— ๋Œ€ํ•ด ์–ด๋–ค ์†”๋ฃจ์…˜์„ ์„ ํƒํ–ˆ๋Š”์ง€ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜์—†๋Š” ์™„์ „ํ•œ ํ˜ผ๋ž€์œผ๋กœ ๋๋‚˜์ง€ ์•Š๋„๋ก ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•„๋“œ๊ฐ€ ๊ณต๊ฐœ์ธ์ง€ ๋น„๊ณต๊ฐœ์ธ์ง€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์œ ํ˜• ์‹œ์Šคํ…œ์ด ๋” ๋ช…ํ™• ํ•ด์ง‘๋‹ˆ๋‹ค. ํ•„๋“œ๋Š” ํ•ญ์ƒ ๋น„๊ณต๊ฐœ์ž…๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ๋Š” ๊ณต๊ฐœ๋˜๋ฉฐ ์œ ํ˜•์€ ์ธํ„ฐํŽ˜์ด์Šค / ํ”„๋กœํ† ์ฝœ / ํŠน์„ฑ์„ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ์„ ์–ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ฃผ์–ด์ง„ ๋ฉ”์†Œ๋“œ ์„ธํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” @stevengj ์˜ https://github.com/JuliaLang/julia/issues/1974#issuecomment -12083268์— ์œ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค. .

ํ•„๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ํ›„ํšŒํ•  ์œ ์ผํ•œ ์žฅ์†Œ๋Š” DataFrames . df[:a] ๋Š” df.a ๋งŒํผ ์ข‹์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๊ทธ๋ ‡๊ฒŒ ํฐ ๋ณ€ํ™”๋ฅผ ํ•„์š”๋กœํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” PyCall ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ•„๋“œ ์˜ค๋ฒ„๋กœ๋”ฉ์ด ํ—ˆ์šฉ๋˜์–ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋งค์šฐ ๊ตฌ์ฒด์ ์ธ ๋น„ ์ค„๋ฆฌ์•ˆ ์‚ฌ์šฉ ์‚ฌ๋ก€์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ๋žŒ๋“ค์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๊ฒŒ๋˜๋ฉด ์˜ค์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ํŠน์ˆ˜ ๋ชจ๋“ˆ์—์„œ ์ˆจ๊ธฐ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@nalimilan , ๊ฐ€๋Šฅํ•œ ํ•œ x.property ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์„ ํ˜ธ๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์‚ฌ๋žŒ๋“ค์ด _ ์ •๋ง _์ด ๊ตฌ๋ฌธ์„ ์ข‹์•„ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค โ€“ ๊ทธ๊ฒƒ์€ ๋งค์šฐ ์ฆ๊ฒ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฉ‹์ง„ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ณ  ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋‚ด๋ถ€ ์•ก์„ธ์Šค์—๋งŒ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๊ณ  ๊ตฌ์ฒด์ ์œผ๋กœ ๋งํ•˜๋Š” ๊ฒƒ์€ ์™„์ „ํžˆ ๋น„๋šค์–ด์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. "ํ•˜,์ด ๋ฉ‹์ง„ ๊ตฌ๋ฌธ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”!" API๊ฐ€ ์ถ”์•…ํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋„๋กํ•˜๋Š” ๋Œ€์‹  ์‚ฌ์ ์ธ ๊ฒƒ์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ตฌ๋ฌธ์„ ๋œ ํŽธ๋ฆฌํ•˜๊ณ  ์˜ˆ์˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด๊ฒƒ์€ .. ์—ฐ์‚ฐ์ž ์ธ private _real_ ํ•„๋“œ ์•ก์„ธ์Šค ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ ์ข‹์€ ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ €๋Š” ์‚ฌ์‹ค์ด ๋ณ€ํ™”๊ฐ€ ์ƒํ™ฉ์„ ๋œ ๋ช…ํ™•ํ•˜๊ณ  ์ผ๊ด€์„ฑ์žˆ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฒ”์œ„๋ฅผ ๊ณ ๋ คํ•˜์„ธ์š”. ํ˜„์žฌ step(r) ๋Œ€ r.step ์Šคํƒ€์ผ์˜ ๋”์ฐํ•œ ์กฐํ•ฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ œ๊ฐ€ FloatRange ๋„์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ step(r) ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ ๋งŒ ์ •ํ™•ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. ํ˜ผํ•ฉ์˜ ์ด์œ ๋Š” ๋ฒ”์œ„์˜ ์ผ๋ถ€ ์†์„ฑ์ด ์ €์žฅ๋˜๊ณ  ์ผ๋ถ€๊ฐ€ ๊ณ„์‚ฐ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋˜์–ด ์‹ค์ œ๋กœ ๋ฒ”์œ„ ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. step(r) ์ž์ฒด์˜ ์ •์˜๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋“  ์•ก์„ธ์Šค๊ฐ€ step(r) ์Šคํƒ€์ผ์ด๋ฉด ๋” ๋‚˜์€ ์Šคํƒ€์ผ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๊ฐ€ํŒŒ๋ฅธ ์‹ฌ๋ฆฌ์  ์žฅ๋ฒฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ r.step ๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ r..step ํ•˜๋Š” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๋กœ ๋งŒ๋“ค๋ฉด ์‚ฌ๋žŒ๋“ค์€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒํ•˜๊ณ  ์‹ถ์€ ์ผ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•…๋งˆ์˜ ์˜นํ˜ธ์ž (๋‚˜์™€ ํ•จ๊ป˜) ์—ญํ• ์„ํ•˜๋ ค๋ฉด r.length ๋˜๋Š” length(r) ์จ์•ผํ•ฉ๋‹ˆ๊นŒ? ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜์™€ ๋ฉ”์„œ๋“œ ์‚ฌ์ด์˜ ๋ถˆ์ผ์น˜๋Š” Python์„ ๊ดด๋กญํžˆ๋Š” ๋ฌธ์ œ์ด๋ฉฐ Ruby๋Š” r.length ์Šคํƒ€์ผ์— ์ „์ ์œผ๋กœ ํ—Œ์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค.

.. +1 Core.getfield !

@StefanKarpinski ๋ง์ด ๋˜๊ฒ ์ง€๋งŒ ๊ฐœ์ธ ํ•„๋“œ์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•ด์•ผํ•˜๋ฉฐ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ฉ”์„œ๋“œ์™€ ๊ณต์šฉ ํ•„๋“œ๋ฅผ ๋ชจ๋‘ ์ง€์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๋ ค๋ฉด ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. length ๊ฒฝ์šฐ๋Š” ์–ด๋ ต์ง€๋งŒ size ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ์œ ์‚ฌํ•˜์ง€๋งŒ ์ฐจ์› ์ธ๋ฑ์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฐ์ •์€ ์›œ ์บ”์„ ์—ฝ๋‹ˆ ๋‹ค ...

์ด ๊ฒฝ์šฐ ์‹ค์ œ ํ•„๋“œ์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด .. ๋„ ์ง€์›ํ•˜๊ณ  ๋ฉ”์„œ๋“œ ๋˜๋Š” ์‹ค์ œ ๊ฐ’์— ๊ด€๊ณ„์—†์ด ํ•„๋“œ์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด . ํ•ฉ๋‹ˆ๋‹ค.

์•…๋งˆ์˜ ์˜นํ˜ธ์ž (๋‚˜์™€ ํ•จ๊ป˜) ์—ญํ• ์„ํ•˜๋ ค๋ฉด r.length ๋˜๋Š” length(r) ์จ์•ผํ•ฉ๋‹ˆ๊นŒ? ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜์™€ ๋ฉ”์„œ๋“œ ์‚ฌ์ด์˜ ๋ถˆ์ผ์น˜๋Š” Python์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋ฌธ์ œ์ด๋ฉฐ Ruby๋Š” r.length ์Šคํƒ€์ผ์— ์ „์ ์œผ๋กœ ํ—Œ์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒํ•˜๋Š” ํ•ต์‹ฌ ์š”์†Œ๋Š” ์–ด๋–ค ๊ฒƒ์„ ๊ณ ์ฐจ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ์ฆ‰, f ์˜ f(x) ๋Š” ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•ด map ํ•  ์ˆ˜์žˆ๋Š” ๋ฐ˜๋ฉด f ์˜ x.f ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. x -> x.f ) โ€“ ๋‹จ์ผ ๋””์ŠคํŒจ์น˜ ์–ธ์–ด์˜ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

ํ•„๋“œ ์•ก์„ธ์Šค์—์„œ ์™œ ๋ฉˆ์ถ”๋‚˜์š”? x.foo(args...) ๋ฅผ getfield(x::MyType, ::Field{:foo}, args...) = ... ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ฒซ ๋ฒˆ์งธ ์ฐจ์›์˜ ํฌ๊ธฐ์— ๋Œ€ํ•ด x.size(1) ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๋‚ด ์ œ์•ˆ์ด ๋งˆ์Œ์— ๋“œ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ์‚ฌ๋žŒ๋“ค์ด OO์™€ ์œ ์‚ฌํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋งˆ๋„ ์•„๋‹๊นŒ์š”?)

์ด ๊ธฐ๋Šฅ์œผ๋กœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ €๋ฅผ ๋ฉˆ์ถœ ์ˆ˜์žˆ๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋Ÿฐ oo ์Šคํƒ€์ผ ์ฝ”๋“œ์— ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค โ€“ ์ œ๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ๊ฝค ์ฆ๊ฒ๊ณ  ์‚ฌ๋žŒ๋“ค์ด ์ •๋ง ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค โ€“ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ํ•ด์•ผ ํ•  ์ผ์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ์ •์ฑ…์ด _ ์ •๋ง๋กœ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ถฉ๋ถ„ํ•œ ์„ ํƒ์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ํ•  ์ˆ˜์žˆ๋Š” ์ผ์— ๋งค์šฐ ์ž์œ ๋กœ์šธ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ค„๋ฆฌ์•„๋ฅผ ๋ฐฐ์šฐ๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ์ ์—†๋Š” ๊ตฌ๋ฌธ์€ OO ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ์„ ์ •์‹ ์ ์œผ๋กœ ๋†“์•„์ฃผ๋Š” ๋ฐ ๋งŽ์€ ๋„์›€์ด๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ ์ด์œ ๋งŒ์œผ๋กœ ์ œ ์ œ์•ˆ์ด ๋‚˜์˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ฐ„๋‹จํ•œ ์˜ค๋ฒ„๋กœ๋”ฉ (์ฆ‰, a.b sans (args...) )์˜ ๊ฒฝ์šฐ ์œ„์˜ @nalimilan ์˜ ์˜๊ฒฌ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด์Šˆ # 4935์—์„œ ํ•ฉ์˜๋Š” ํ•„๋“œ๊ฐ€ API์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฉ”์„œ๋“œ ๋งŒ ์žˆ์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ทธ ๋ฌธ์ œ๋Š” ์ข…๊ฒฐ ๋  ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. . -overloading ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋ฐ˜ ํ•„๋“œ๊ฐ€ API์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ›จ์”ฌ ๋œ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•„๋“œ๋ฅผ API์˜ ์ผ๋ถ€๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์˜ˆ, . ๊ตฌ๋ฌธ์ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค ...

์–ด๋–ป์Šต๋‹ˆ๊นŒ : ๋‹จ์ผ . ์€ _only_ getfield(x::MyType, ::Field{:name}) = ... ๋Œ€ํ•œ ๊ตฌ๋ฌธ ์  ์„คํƒ•์ด์–ด์•ผํ•˜๋ฉฐ ํ•„๋“œ ์•ก์„ธ์Šค๋Š” _only_์—์„œ .. (์ฆ‰, . ๊ฐ€ ์ง€๊ธˆ ๋ฌด์—‡์ธ์ง€).

์ด๊ฒƒ์€ ๋ช…ํ™•ํ•œ ๊ตฌ๋ณ„์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • . ๋Š” ์œ ํ˜• ์ธ์Šคํ„ด์Šค์˜ ๊ฐ’๊ณผ ์œ ์‚ฌํ•œ ๊ฒƒ์— ์•ก์„ธ์Šคํ•˜๊ธฐ์œ„ํ•œ ๊ณต์šฉ API ์šฉ์ž…๋‹ˆ๋‹ค.
  • .. ๋Š” ํ•„๋“œ ์•ก์„ธ์Šค ์šฉ์ด๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ณต์šฉ API์—์„œ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ด๊ฒƒ์€ ํฐ ๋ณ€ํ™”๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ฐ€ ์ œ์•ˆํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹จ . ๊ธฐ๋ณธ๊ฐ’์€ .. ์ด๋ฏ€๋กœ ๊นจ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ฝ์–ด์•ผ ํ–ˆ์–ด์š”!

ํ•˜์ง€๋งŒ . ๊ธฐ๋ณธ๊ฐ’์ด .. ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ณต๊ฐœ API๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•„๋‹Œ์ง€์— ๋Œ€ํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๊ฒŒ๋˜๋ฏ€๋กœ ์‹ค์ œ๋กœ ์ข‹์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ .. ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ฝ”๋“œ๊ฐ€ ์†์ƒ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์˜ˆ์ƒ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐ˜๋ฉด . ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฑด ์ข‹์€ ์ง€์ ์ด์•ผ. ์ง€์› ์ค‘๋‹จ ๊ฒฝ๊ณ ์™€ ํ•จ๊ป˜ a.b ๊ธฐ๋ณธ๊ฐ’์„ a..b ๋กœ ์„ค์ •ํ•˜์—ฌ ํ•ด๋‹น ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šคํƒ€์ผ์˜ ๊ด€์ ์—์„œ ๋ณด๋ฉด

a = [1:10]
a.length()
a.size()

๋ณด๋‹ค

a.length
a.size

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋–ค ์‹ ์œผ๋กœ๋“  ์œ ํ˜•์— ์ €์žฅ๋œ ์†์„ฑ์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋Œ€์‹  ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์„ ๋ณด์กดํ•˜๋Š” ๋ฐ ๋„์›€์ด๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (์œ„์˜ "์ˆœ๋„"๋ฌธ์ œ๋กœ ๋Œ์•„๊ฐ€์„œ). ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์Šคํƒ€์ผ์„ ๋ณด์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ์–ธ์–ด ์—์„œ์ฒ˜๋Ÿผ ์ผ์ด ๋ณต์žกํ•ด์ง€์ง€ ์•Š๋„๋กํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ •๋ง๋กœ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š”๋‹ค

a.length()

๊ทธ ์ดํ›„๋กœ ์›๋ž˜ ์œ ํ˜•์— ํ•จ์ˆ˜ ํ•„๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. . ํ•„๋“œ์— ์•ก์„ธ์Šคํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ด๋Š” ๋ถ„๋ช…ํžˆ ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ ๋ณด์ž…๋‹ˆ๋‹ค.

์„ ํ—˜์ ์œผ๋กœ a.length() ๋˜๋Š” a.length ํ•˜์ง€ ๋ง์•„์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์งˆ๋ฌธ์€ ์™œ์ž…๋‹ˆ๊นŒ? r.step ๊ฐ€ r.length ์™€ ๋‹ค๋ฅธ ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‹ค๋ฅธ๊ฐ€์š”? ๋‹ค๋ฅด์ง€ ์•Š์€ ๊ฒฝ์šฐ step(r) ๋ฐ length(r) ๋˜๋Š” r.step ๋ฐ r.length ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

Stefan์ด ์ œ์•ˆํ•œ ์˜๋ฏธ๋ก ๊ณผ ๋‚˜์— ์˜ํ•œ ์ถ”๊ฐ€๋ฅผ ํ†ตํ•ด . ํ•ญ์ƒ ํ•จ์ˆ˜ ํ˜ธ์ถœ ( + ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ) ์ธ ๋ฐ˜๋ฉด .. ๋Š” ํ•ญ์ƒ ํ•„๋“œ์ž…๋‹ˆ๋‹ค. ์ ‘์†ํ•˜๋‹ค.

๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ๋Š” a.length ๋“ฑ์ด ์ข‹์€ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. . ์•ก์„ธ์Šค๋Š” ์œ ํ˜•์˜ ์‹ค์ œ ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐ์—๋งŒ ์‚ฌ์šฉ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. dict์˜ ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. . size , length , step ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๊ฐ€์—†๋Š” ์†์„ฑ์— ๋Œ€ํ•œ ํ•จ์ˆ˜๋ฅผ ๊ณ ์ˆ˜ํ•˜๋Š” ๋ฐ˜๋ฉด, ์ผ๋ถ€๋Š” ์ถ”๊ฐ€ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๊ณ  a.size(1) ๊ตฌ๋ฌธ ์œ ํ˜•์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ๋‚˜์˜ ๊ฒฌํ•ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋„ํŠธ ๊ตฌ๋ฌธ์€ ์œ ํ˜• / ํด๋ž˜์Šค์˜ ์†์„ฑ์—๋งŒ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฒŒํ„ฐ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์„ธํ„ฐ์— ๊ด€ํ•œ ๊ฒƒ์ด๋ฉฐ a.property() = ... ์™€ ๊ฐ™์€ ๊ฒƒ์€ ์™„์ „ํžˆ ์ž˜๋ชป๋˜์—ˆ๋‹ค๊ณ  ๋Š๋‚๋‹ˆ๋‹ค.
  • ๋‚˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๊ณต๊ฐœ API๋ฅผ ์ •์˜ํ•˜๊ณ  ํ•„๋“œ๊ฐ€ ๋น„๊ณต๊ฐœ ์ธ ํ˜„์žฌ ์ƒํ™ฉ์„ ์ข‹์•„ํ•˜์ง€๋งŒ, ๋‚˜๋Š” ์  ๊ตฌ๋ฌธ์ด ๊ณต๊ฐœ API์— ๋Œ€ํ•ด ๊ธˆ์ง€ ๋˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์ข‹๋‹ค๋Š” Stefans์˜ ์˜๊ฒฌ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์„ ๊ฐ„๋‹จํ•œ ์†์„ฑ์œผ๋กœ ์ œํ•œํ•˜์‹ญ์‹œ์˜ค. a.length ๊ฐ€ ์ข‹์€ ์˜ˆ์ž…๋‹ˆ๋‹ค. a.size(1) ๋Š” ์ถ”๊ฐ€ ์ธ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • . ๊ธฐ๋ณธ๊ฐ’์„ .. . Julia๋Š” ์ƒ์šฉ๊ตฌ ์–ธ์–ด๋กœ ์•Œ๋ ค์ ธ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์œ ์ง€ํ•˜์ž

. ๊ธฐ๋ณธ๊ฐ’์„ .. . Julia๋Š” ์ƒ์šฉ๊ตฌ ์–ธ์–ด๋กœ ์•Œ๋ ค์ ธ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์œ ์ง€ํ•˜์ž

๋‚˜๋Š” ์ด๊ฒƒ์— ๋™์˜ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ฌ์ง€์–ด ํ•ฉ์„ฑ ์†์„ฑ์„ ์„ค์ •ํ•˜๋Š” ๊ตฌ๋ฌธ์€ ๊ฒƒ a.property = b ํ•˜์ง€ a.property() = b .

๋ฌผ๋ก , ๊ตฌ๋ฌธ์œผ๋กœ์„œ a.property() ๊ฐ€ IMHO๊ฐ€ ์ข‹์ง€ ์•Š์€ ์ด์œ ๋ฅผ ๋ช…ํ™•ํžˆํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ๋” ๋ช…ํ™•ํ•˜๊ฒŒ : ์  ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์ค‘์š”ํ•œ ์ ์€ ํ•จ์ˆ˜๋ฅผ ์œ ํ˜• / ํด๋ž˜์Šค์™€ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ getter / setter๋ฅผ ์ข‹์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  getter / setter๋Š” ๋ฐ์ดํ„ฐ ์บก์Šํ™”์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค (์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€ํ•˜์ง€๋งŒ ๊ตฌํ˜„์„ ๋ณ€๊ฒฝ)

์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ API ๋””์ž์ด๋„ˆ์˜ ๊ด€์ ์—์„œ ๋ณผ ๋•Œ ํ›Œ๋ฅญ ํ•  ๊ฒƒ์ด์ง€๋งŒ ๋ฏธ๋ž˜์˜ ๋ถˆ์ผ์น˜๋ฅผ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด ์ผ์ข…์˜ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜์–ด์•ผํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ dsl๊ณผ ๊ฐ™์€ Ruby๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ...

amt = 1.dollar + 2.dollars + 3.dollars.20.cents 

๊ทธ๋Ÿฌ๋‚˜ ๊ด‘๊ธฐ์ฒ˜๋Ÿผ ์ž๋ฐ”์— ๋Œ€๋น„ํ•˜์‹ญ์‹œ์˜ค.

object.propert1.property2.property3 ....

๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ :

  • ๋‚˜๋Š” ๊ธฐํ˜ธ๋ฅผ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๋Š” Dicts์— ๋Œ€ํ•ด . ๊ตฌ๋ฌธ์„ ๊ฐ€์žฅ ์›ํ•ฉ๋‹ˆ๋‹ค. d.key ๋‹ค์Œ d[:key] ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฒฐ๊ตญ ๊ทธ๊ฒƒ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • a->property ๊ฐ€ a..property ๋ณด๋‹ค ๋” ์ž˜ ์ฝ๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์‹œ ๊ทธ๊ฒƒ์€ ๊ทธ๋ ‡๊ฒŒ ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ฉฐ julia ๊ตฌ๋ฌธ์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@BobPortmann ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์ „์€ ์ปจํ…Œ์ด๋„ˆ ๊ฐ์ฒด์ด๊ณ  ์ปจํ…Œ์ด๋„ˆ ๊ฐ์ฒด์˜ API๋Š” obj [index] ๋˜๋Š” obj [key]์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ Julia์— ์†์„ฑ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ปจํ…Œ์ด๋„ˆ API๊ฐ€ ์˜ค๋ฒ„๋กœ๋“œ๋˜์–ด PyCall๊ณผ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ OpenCL์—์„œ์ด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์˜ค๋ฒ„๋กœ๋“œ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ปจํ…Œ์ด๋„ˆ API์˜ ๊ตฌ๋ณ„์„ ๊ฐ•ํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค.

๋น„๊ณต๊ฐœ ํ•„๋“œ์— a->property ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด C ํ•ด์ปค๊ฐ€ Julia๋กœ๋ถ€ํ„ฐ ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ์žˆ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค ;-)

์ €๋Š” .. ๊ตฌ๋ฌธ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

a->property ๊ตฌ๋ฌธ์€ ์ด๋ฏธ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ต๋ช… ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ a..b ์—ฐ์‚ฐ์ž๋Š” ์ž ์‹œ ๋™์•ˆ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”•์…”๋„ˆ๋ฆฌ์™€ ๋น„์Šทํ•˜์ง€๋งŒ ์„ ํƒ ํ•„๋“œ๊ฐ€ ๋งŽ์€ ๊ฒƒ์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. getter / setter ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด dict ์ธ๋ฑ์‹ฑ ๊ตฌ๋ฌธ๋ณด๋‹ค ๋” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

"a-> property ๊ตฌ๋ฌธ์€ ์ด๋ฏธ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ต๋ช…์˜ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค."

์˜ˆ, ๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. -> ์ฃผ์œ„์— ๊ณต๋ฐฑ์ด์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์Šคํƒ€์ผ ๊ฐ€์ด๋“œ ๋ผ์ธ์œผ๋กœ property (x)๋ฅผ ์ฝ๊ธฐ ์ „์šฉ ์†์„ฑ์— ์‚ฌ์šฉํ•˜๊ณ  x.property๋ฅผ ์ฝ๊ธฐ / ์“ฐ๊ธฐ ์†์„ฑ์— ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ์†์„ฑ์˜ ๊ฒฝ์šฐ x.foo = bar๊ฐ€ set_foo! (x, bar)๋ณด๋‹ค ํ›จ์”ฌ ์ข‹์Šต๋‹ˆ๋‹ค.

์ฝ๊ธฐ์— foo(x) , ์“ฐ๊ธฐ์— x.foo ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ด๊ฒƒ์€ ์†์„ฑ์ด ๊ทธ๋ ‡๊ฒŒ ๋งค๋ ฅ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ์•ก์„ธ์Šค์— ๋Œ€ํ•ด ๋™์ผํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์–ป์„ ์ˆ˜์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๊ตฌ๋ฌธ (๊ฒŒํ„ฐ ๋ฐ ์„ธํ„ฐ ์šฉ)

์Šคํƒ€์ผ๊ณผ ๊ด€๋ จํ•˜์—ฌ์ด ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜๋ฉด x.length ๋ฐ length(x) ๋‘˜ ๋‹ค ๊ฐ–๊ณ  ์‹ถ์€์ง€ ๋˜๋Š” ์ดํ›„ ์–‘์‹์„ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ œ๊ฑฐํ•ด์•ผํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ํฐ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ ์ƒ๊ฐ์—๋Š” ์šฐ๋ฆฌ๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ๋งŒ ๊ฐ€์ ธ์•ผํ•˜๊ณ  ์•ž์œผ๋กœ x.length ๋งŒ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์Šคํƒ€์ผ์— ๊ด€ํ•ด์„œ๋Š” ์•„์ฃผ ๊ฐ„๋‹จํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜•์˜ ๋‹จ์ˆœํ•œ ์†์„ฑ ์ธ ๋ชจ๋“  ๊ฒƒ์€ ํ•„๋“œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์ด์žˆ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ. ๋‚˜๋Š” C #์—์„œ ์†์„ฑ์„ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ๊ณ  ์–ด๋–ค ๊ฒƒ์ด ์†์„ฑ์ด์–ด์•ผํ•˜๋Š”์ง€ ์•„๋‹Œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ๊ฑฐ์˜ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌด์ž‘์œ„๋กœ ์„ ํƒํ•œ 1 ์ธ์ˆ˜ ํ•จ์ˆ˜ ์ง‘ํ•ฉ์„ x.f ๊ตฌ๋ฌธ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” @ mauro3 ๊ฐ€ ์ด๊ฒƒ์„ํ•˜๋Š” ๊ฒƒ์ด ์–ธ์–ด์˜ ๋ณธ์งˆ์„ ๋ชจํ˜ธํ•˜๊ฒŒํ•œ๋‹ค๋Š” ์ข‹์€ ์ง€์ ์„ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

a.b ์€ ์ ์–ด๋„ ์‹œ๊ฐ์ ์œผ๋กœ ์ผ์ข…์˜ ๋ฒ”์œ„ ์ง€์ • ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค. b ๋Š” ์ „์—ญ์—์„œ ๋ณผ ์ˆ˜์žˆ๋Š” ์‹๋ณ„์ž ์ผ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์ชฝ ๋ถ€๋ถ„์ด์žˆ๋Š” ํ–‰๋ ฌ ๋ถ„ํ•ด์—๋Š” .U ์†์„ฑ์ด ์žˆ์ง€๋งŒ ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค --- ์ „์—ญ ํ•จ์ˆ˜ U ๋Š” ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๊ฒƒ์€ ์•ฝ๊ฐ„ ์ฃผ๊ด€์ ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ U(x) = x.U ์‰ฝ๊ฒŒ ์ •์˜ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ length ๋Š” ๋‹ค๋ฅธ ์ข…๋ฅ˜์ž…๋‹ˆ๋‹ค. ์ผ๋“ฑ์„์ด๋˜๋Š” ๊ฒƒ์ด ๋” ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : map(length, lst) ).

๋‚ด๊ฐ€ ์ œ์•ˆ ํ•  ์ง€์นจ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. foo.bar ํ‘œ๊ธฐ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

  1. foo ์—๋Š” ์‹ค์ œ๋กœ bar ๋ผ๋Š” ํ•„๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ : (1:10).start .
  2. foo ๋Š” ๊ด€๋ จ ์œ ํ˜• ๊ทธ๋ฃน์˜ ์ธ์Šคํ„ด์Šค์ด๋ฉฐ, ๊ทธ์ค‘ ์ผ๋ถ€์—๋Š” ์‹ค์ œ๋กœ .bar ๋ผ๋Š” ํ•„๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. foo ์‹ค์ œ๋กœ bar ํ•„๋“œ๊ฐ€ ์—†๋”๋ผ๋„ ํ•ด๋‹น ํ•„๋“œ์˜ ๊ฐ’์€ ํ•ด๋‹น ์œ ํ˜•์— ์˜ํ•ด ์•”์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ : (1:10).step , (0.1:0.1:0.3).step .
  3. foo ๋Š” ๋ช…์‹œ ์ ์œผ๋กœ bar ์ €์žฅํ•˜์ง€ ์•Š์ง€๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ๋œ ํŽธ๋ฆฌํ•œ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ฑฐ๋‚˜ ํšจ์œจ์ ์ธ ํ˜•์‹์œผ๋กœ ๋™๋“ฑํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ : lufact(rand(5,5)).U .
  4. Python ๋˜๋Š” Java์™€ ๊ฐ™์€ ๋‹ค๋ฅธ API๋ฅผ ์—๋ฎฌ๋ ˆ์ดํŠธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

bar ์†์„ฑ์€ ์ผ€์ด์Šค 1๊ณผ 3์—์„œ๋Š” ํ• ๋‹น ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ 2๋Š” ํ• ๋‹น ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ผ€์ด์Šค 2์˜ ๊ฒฝ์šฐ ๊ฐ’ ์œ ํ˜•์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ bar ์†์„ฑ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๊ทธ ์œ ํ˜•์— ์˜ํ•ด ์•”์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๊ด€๋ จ ์œ ํ˜•์˜ bar ์†์„ฑ์„ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๋ช…์‹œ ์ ์œผ๋กœ foo.bar = baz ์˜ค๋ฅ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ณ€๊ฒฝ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@tknopp , ๋‚˜๋Š” ์“ฐ๊ธฐ์— x.foo ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ฝ๊ธฐ์— foo(x) ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด ์ œ์•ˆ์€ _if_ ์†์„ฑ์ด ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๊ฐ€ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์•„๋งˆ๋„ x.foo ์ฝ๊ณ  ์“ฐ๊ธฐ๋ฅผ _both_ํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@StefanKarpinski :ํ•˜์ง€๋งŒ length ์˜ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํฌ๊ธฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ €์žฅ๋˜๋Š” ๊ฒƒ์ด๊ณ  length ๋Š” ํฌ๊ธฐ์˜ ์ œํ’ˆ์ž…๋‹ˆ๋‹ค.

Jeffs๋Š” ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด ๋” ์ด์ƒ ์ผ๋ฅ˜๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์ง€์ ํ•ฉ๋‹ˆ๋‹ค.

@stevengj :

@tknopp โ€“ ๊ธธ์ด๋Š” ํฌ๊ธฐ์—์„œ ํŒŒ์ƒ๋˜์ง€๋งŒ ํฌ๊ธฐ์™€ ๋™์ผํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ํฌ๊ธฐ๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ๊ธธ์ด๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ ๋ฐ˜๋Œ€๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๊ฒƒ์€ ์•ฝ๊ฐ„ ํ๋ฆฟํ•œ ์„ ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด lufact ํ—ˆ์šฉ๋˜๋Š” ์ฃผ๋œ ์ด์œ ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๋ณด๋‹ค ๋” ๋‚˜์€ API๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ์ ‘๊ทผ๋ฒ•์€ ์ผ๋ฐ˜ ํ–‰๋ ฌ์˜ ์ƒ๋ถ€ ์‚ผ๊ฐ ๋ถ€๋ถ„๊ณผ ํ•˜๋ถ€ ์‚ผ๊ฐ ๋ถ€๋ถ„์„ ์ œ๊ณตํ•˜๋Š” upper ๋ฐ lower ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์˜ˆ๋ฅผ ๋“ค์–ด QR ๋ถ„ํ•ด๋กœ ์ผ๋ฐ˜ํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

_really_๊ฐ€์ด ๊ตฌ๋ฌธ์„ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒฝ์šฐ๋Š” pycall, factorizations, ๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
f(x) ๋Œ€ x.f ์˜ ๋ฌด์ž‘์œ„ ๋’ค์ฃฝ๋ฐ•์ฃฝ์œผ๋กœ ๋ ๋‚ ๊นŒ ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์„ ๋ฐฐ์šฐ๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋” ์–ด๋ ค์›Œ ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@StefanKarpinski ๋ชฉ๋ก์˜ 1 ๋ฒˆ ์ง€์ ์ด ์œ ํ˜•์˜ ํ•„๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ๊ณต์šฉ API์— ์†ํ•จ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

ํ˜„์žฌ ๋ชจ๋“ˆ์˜ ๊ณต์šฉ API๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋‚ด ๋ณด๋‚ธ ํ•จ์ˆ˜์™€ ์œ ํ˜• (ํ•„๋“œ๋Š” ์•„๋‹˜). ์ด ๋ณ€๊ฒฝ ํ›„์—๋Š” ์–ด๋–ค ํ•„๋“œ๊ฐ€ ๊ณต์šฉ API์— ์†ํ•ด์•ผํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ ์—์„œ์ฒ˜๋Ÿผ ๊ฐœ์ธ ํ•„๋“œ์˜ ์ด๋ฆ„์„ a._foo ์ •๋„๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ์ข‹์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ DataFrames ์‚ฌ๋ก€๋Š” ์•ฝ๊ฐ„ ๋ถˆํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด DataFrames์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ ํ•  ๊ฒƒ์ด์ง€๋งŒ ๋ช‡ ๊ฐœ์˜ ๋ฌธ์ž๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ผ๊ด€์„ฑ ์†์‹ค์ด ํ›จ์”ฌ ๋” ๋ฌธ์ œ๊ฐ€๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ DataFrames, PyCall์— ์˜์กดํ•˜๋Š” ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  Gtk๋„ ๊ทธ๊ฒƒ์„ ์›ํ•ฉ๋‹ˆ๋‹ค). ํ•„๋“œ๊ฐ€ ๊ณต์šฉ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ผ๋ถ€๊ฐ€๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ฑฐ๋‚˜ ( "๋ฉ‹์ ธ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์—") ์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

... ํŒŒ์ด ์ฝœ ...

๋ฐ JavaCall

์ด๊ฒƒ์˜ ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋น„ ์ค„๋ฆฌ์•„ ์‹œ์Šคํ…œ๊ณผ์˜ ์ƒํ˜ธ ์ž‘์šฉ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ . ์˜ค๋ฒ„๋กœ๋“œ ๋Œ€์‹  ์ œ์•ˆ ๋œ .. ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ์„œ ๋” ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ์ฑ…์ด OO์— ๋Œ€ํ•œ ๋” ์ผ๋ฐ˜์ ์ธ ํ•ดํŠธ ํŒ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

#we already do
A[b] => getindex(A,b)
#we could have
A.b(args...) => b(A, args...)
# while
A..b => getfield(A,::Field{:b})
# with default
getfield(A, ::Field{:b}) = getfield(A, :b)

์ด๊ฒƒ์€ JavaCall / PyCall์ด "in"ํด๋ž˜์Šค์—์„œ ๋ฉ”์†Œ๋“œ ์ •์˜๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๋™์‹œ์— ์‚ฌ๋žŒ๋“ค์ด OO ์œ ํ˜• ์ฝ”๋“œ๋ฅผ ๊ฐ–๊ณ  ์žํ•˜๋Š” ๊ฒฝ์šฐ ์ผ๋ฐ˜ ์Šคํƒ€์ผ์„ ํ—ˆ์šฉํ•˜์ง€๋งŒ ๋งค์šฐ ํˆฌ๋ช…ํ•˜์ง€๋งŒ A.b() ๋Š” ์žฌ ์ž‘์„ฑ์ผ๋ฟ์ž…๋‹ˆ๋‹ค. OO์—์„œ ์˜ค๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ์ด๊ฒƒ์ด ๋งค์šฐ ์ž์—ฐ์Šค๋Ÿฌ์šด ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ getfield ์™€ ํ•จ๊ป˜ A..b ๊ฐ€์žˆ๋Š” ์ƒˆ๋กœ์šด getfield A..b ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๊ธฐ์—์„œ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ํ—ˆ์šฉํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ ์˜ค๋ฒ„๋กœ๋”ฉํ•˜๋Š” ๊ฒƒ์€ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•˜์ง€ ์•Š์œผ๋ฉฐ ํ•„๋“œ ์œ ์‚ฌ / ์†์„ฑ์—๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค (๋งค์šฐ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜์ง€๋Š” ์•Š์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. getfield(A, ::Field{:field}) ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ์•ฝ๊ฐ„ ๋ฌด์„ญ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@ mauro3 :

@StefanKarpinski ๋ชฉ๋ก์˜ 1 ๋ฒˆ ์ง€์ ์ด ์œ ํ˜•์˜ ํ•„๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ๊ณต์šฉ API์— ์†ํ•จ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์€ ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์•„๋‹ˆ๋ผ foo.bar ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•ด๋„๋˜๋Š” ๋•Œ์˜ ๋ชฉ๋ก์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋น„ํ™œ์„ฑํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค foo.bar ๋งŒ ํ†ตํ•ด ์•ก์„ธ์Šค ํ•  ๊ฒƒ "๊ฐœ์ธ"ํ•„๋“œ์— ๋Œ€ํ•œ ํ‘œ๊ธฐ foo..bar .

@karbarcca : ๋‚˜๋Š” ๋‹น์‹ ์ด ์—ฌ๊ธฐ์„œ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

fwiw, ์ €๋Š” ๋™์˜ํ•˜๋Š” ์„ฑ์ธ์šฉ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  . ์™„์ „ํžˆ ์˜ค๋ฒ„๋กœ๋“œ ํ•  ์ˆ˜์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ํŒฌ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด์ค‘ ์  ์ œ์•ˆ์ด ๋œ ํ˜ผ๋ž€ ์Šค๋Ÿฝ๊ธฐ๋ณด๋‹ค๋Š” ๋” ๋งŽ์€ ํ˜ผ๋ž€์œผ๋กœ ์ด์–ด์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

@ihnorton โ€“ a..b ๋ฅผ ํ•„๋“œ ์•ก์„ธ์Šค๋ฅผ์œ„ํ•œ (์–ธ ์˜ค๋ฒ„๋กœ๋“œ ๊ฐ€๋Šฅํ•œ) ์ฝ”์–ด ๊ตฌ๋ฌธ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ a..b ๋ฅผ ์˜ค๋ฒ„๋กœ๋“œ ํ•  ์ˆ˜์žˆ๋Š” ๊ตฌ๋ฌธ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๊นŒ?

Julia์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š” ๋‹จ์ˆœ์„ฑ์ž…๋‹ˆ๋‹ค. x.y ์˜ค๋ฒ„๋กœ๋”ฉ

@StefanKarpinski ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๊ธฐ๋ณธ ๊ฐœ์ธ ํ•„๋“œ์—์„œ ๊ธฐ๋ณธ ๊ณต์šฉ ํ•„๋“œ๋กœ ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ์ƒ๋‹นํ•œ ๋ณ€ํ™”๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ฐฉ๊ธˆ ๊นจ๋‹ฌ์€ ๊ฒƒ์€ ์•„๋งˆ๋„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ถ„๋ช…ํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ . ์˜ค๋ฒ„๋กœ๋”ฉ์œผ๋กœ ์™„์ „ํ•œ OO ์Šคํƒ€์ผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ถ”์•… ํ•˜๊ธดํ•˜์ง€๋งŒ). ์ •์˜

getfield(x::MyType, ::Field{:foo}) = args -> foofun(x, args...) # a method, i.e. returns a function
getfield(x::MyType, ::Field{:bar}) = x..bar+2                  # field access, i.e. returns a value

x.foo(a,b) ๋ฐ x.bar ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋ถ€๋ฅผ ๋…ผ์˜์— ๊ทธ๋ž˜์„œ x.size(1) ๊ตฌํ˜„ ๋˜๋Š” ์œ ์ผํ•œํ•ด์•ผ x.size ๋…ผ์Ÿ์ด๋‹ค.

@StefanKarpinski ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์˜ค๋ฒ„๋กœ๋“œ ๊ฐ€๋Šฅํ•œ a..b ๋ฐ ์•ฝ a..b -> Core.getfield(a,b) ๋Œ€ํ•ด ๋ฏธ์ง€๊ทผํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๋‹ค๋ฅธ ์—ฐ์‚ฐ์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ธฐ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ a..b ์€ ๊ทธ๋‹ค์ง€ ์„ค๋“๋ ฅ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‘ ์บ๋ฆญํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๋Š๋‚Œ์ด ์•„์ฃผ ... a@b , a$b ๋˜๋Š” a|b (๋น„ํŠธ ์—ฐ์‚ฐ์ž๋Š” ๊ทธ๋ ‡๊ฒŒ ์ž์ฃผ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค). ์™ธ๋ถ€ ๊ฐ€๋Šฅ์„ฑ๋„ a b`์ด๋ฉฐ ํŒŒ์„œ๊ฐ€ ๋ช…๋ น๊ณผ ๊ตฌ๋ณ„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ํ•„๋“œ ์•ก์„ธ์Šค์— "์ถ”์•…ํ•œ"์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ตฌ์ฒด์ ์ธ ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ์— ๋‹ค์†Œ ์œ„ํ—˜ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊ฒฝํ—˜์œผ๋กœ ๋ณด์—ฌ์ค€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ปจ๋ฒค์…˜ / ์žฌ ์ž‘์„ฑ์— ์˜ํ•ด OO ๋‹จ์ผ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

type Type end
# I can define methods with my Type as 1st argument
method(T, args...) = # method body
t = Type()
# then I can call that method, exactly like Java/Python methods, via:
t.method(args...)
# so
t.method(args...) 
# is just a rewrite to
method(t, args...)

์—ฌ๊ธฐ์—์„œ ์ •๋‹นํ™”๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ getindex / setindex!์— ๋Œ€ํ•ด ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ ์žฌ ์ž‘์„ฑ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ด๊ฒƒ์œผ๋กœ ์™„์ „ํ•œ OO ๊ตฌ๋ฌธ์„ ํ—ˆ์šฉํ•ฉ์‹œ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด PyCall ๋ฐ JavaCall์ด ์ˆ˜ํ–‰ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

my_dna[:find]("ACT")
# they can do
my_dna.find("ACT")
# by defining the appropriate find( ::PyObject, args...) method when importing modules from Python/Java

๋‚˜๋Š” ์ด๊ฒƒ์ด getindex / setindex์™€ ๊ฐ™์ด ์ƒ๋‹นํžˆ ๋ช…ํ™•ํ•œ ๋ณ€ํ™˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€๋งŒ, ์›ํ•  ๊ฒฝ์šฐ, ํŠนํžˆ OO ์–ธ์–ด ํŒจํ‚ค์ง€์˜ ๊ฒฝ์šฐ ๋‹จ์ผ ๋””์ŠคํŒจ์น˜ OO ์‹œ์Šคํ…œ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์˜ค๋ฒ„๋กœ๋“œ ์˜ต์…˜๊ณผ ํ•จ๊ป˜ ํ•„๋“œ ์•ก์„ธ์Šค์— .. ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉํ•˜๋ฉด PyCall / JavaCall์ด .. ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ์˜ค๋ฒ„๋กœ๋“œํ•˜์—ฌ ํ•„๋“œ ์•ก์„ธ์Šค๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, DataFrames๊ฐ€ ์—ด ์•ก์„ธ์Šค ๋“ฑ์„ ์œ„ํ•ด .. ๋ฅผ ์˜ค๋ฒ„๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ์ƒˆ๋กœ์šด ๊ธฐ๋ณธ ํ•„๋“œ ์•ก์„ธ์Šค์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์œ ํ˜•์— ๋Œ€ํ•ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

์ˆœ์ˆ˜ํ•œ ๊ตฌ๋ฌธ ์žฌ ์ž‘์„ฑ์— ๋Œ€ํ•œ ์†Œํ”„ํŠธ ์ŠคํŒŸ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋‹น์žฅ a.f(x) ํ•˜๊ณ  ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ OO ์–ธ์–ด์™€๋Š” ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ํ‹€๋ฆผ์—†์ด ๋‚˜์œ ์ผ์ž…๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๊ทธ ๋™์ „์˜ ๋‹ค๋ฅธ๋ฉด์€ ๋”์ฐํ•œ ์Šคํƒ€์ผ ์กฐ๊ฐํ™”์ด๋ฉฐ, a.f ๋Š” a.f() ์™€ ๊ณตํ†ต์ ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ™˜์ƒ์ด ๋น ๋ฅด๊ฒŒ ๋ฌด๋„ˆ์ง‘๋‹ˆ๋‹ค.

Julia์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š” ๋‹จ์ˆœ์„ฑ์ž…๋‹ˆ๋‹ค. x.y ์˜ค๋ฒ„๋กœ๋”ฉ

์—ฌ๊ธฐ๋„ ๊ฐ™์€ ๋Š๋‚Œ. ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๊ฒƒ์ด ์ œํ•œ๋œ ์ˆ˜์˜ interop ์œ ํ˜•์— ๋Œ€ํ•œ ๊ฒƒ์ด๋ผ๋ฉด ์œ ํ˜• ์„ ์–ธ์—์„œ ๋ช…์‹œ ์ ์œผ๋กœ ์š”์ฒญํ•œ ๊ฒฝ์šฐ์—๋งŒ ์œ ํšจํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”? ์˜ˆ๋ฅผ ๋“ค๋ฉด ์™ธ์— ์ถ”๊ฐ€ ํ‚ค์›Œ๋“œ type ๋ฐ immutable ๋  ์ˆ˜ ootype ๋˜๋Š” ๋ญ”๊ฐ€.

๊ทธ๋ฆฌ๊ณ  af๊ฐ€ af ()์™€ ๊ณตํ†ต์ ์ด ์—†๋‹ค๋Š” ์‚ฌ์‹ค์€ ํ™˜์ƒ์„ ๋น ๋ฅด๊ฒŒ ๋ฌด๋„ˆ ๋œจ๋ฆฝ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด @JeffBezanson์˜ ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

a.f() ์ž‘๋™ํ•œ๋‹ค๋ฉด a.f ๋Š” ์ผ์ข…์˜ ๋ฉ”์„œ๋“œ ๊ฐ์ฒด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•„, ์•Œ์•˜์–ด. ์˜ˆ, ๋ถ„๋ช…ํžˆ map(t.method,collection) ๊ฐ™์€ ๊ฒƒ์„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

obj.method(...) ๋ฅผ ํ—ˆ์šฉํ•˜๋ฉด ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๊ฐ€ ์ค„๋ฆฌ์•„๋ฅผ ํŒŒ์ด์ฌ, ๋ฃจ๋น„ ๋“ฑ๊ณผ ๊ฒฝ์Ÿํ•˜๋ ค๋Š” ๋˜ ๋‹ค๋ฅธ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์™„์ „ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์„ ์œ„ํ—˜์ด ์žˆ๋‹ค๋Š” @ mauro3 ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค ๋‹ค์ค‘ ๋””์ŠคํŒจ์น˜ ์ธ ๊ต‰์žฅํ•จ. ๋‹ค๋ฅธ ์œ„ํ—˜์€ ํ‘œ์ค€ oo ์Šคํƒ€์ผ์ด ์ง€๊ธˆ๊นŒ์ง€ ๊ฐœ๋ฐœ ๋œ ๋” ๋งŽ์€ ์ค„๋ฆฌ์•ˆ ์Šคํƒ€์ผ๊ณผ๋Š” ๋ฐ˜๋Œ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๋” ์ต์ˆ™ํ•œ ๋ฐฉ์‹์œผ๋กœ ์šฐ์„ธํ•˜๊ฒŒ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

DataFrames ์ด์™ธ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” oo ์–ธ์–ด์™€์˜ ์ƒํ˜ธ ์šด์šฉ์œผ๋กœ ์ œํ•œ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ชจ๋“  ๊ฒƒ์ด ๋งคํฌ๋กœ๋กœ ์ฒ˜๋ฆฌ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ฆ‰, <strong i="8">@oo</strong> obj.method(a) ๊ฐ€ method(obj,a) ๋ฉ๋‹ˆ๊นŒ?

@karbarcca ์ด๊ฒƒ์€ ์ž๋™์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์ด ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ž‘์„ฑ ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

x = 3
x.sin()
sin(x)
x + 2
x.+(2) # ?!

@karbarcca https://github.com/JuliaLang/julia/issues/1974#issuecomment -38830330

t.method (args ...)
#์€ ๋‹จ์ง€ ์žฌ ์ž‘์„ฑ์ผ๋ฟ์ž…๋‹ˆ๋‹ค.
๋ฉ”์†Œ๋“œ (t, args ...)

์˜ค๋ฒ„๋กœ๋“œ ๊ฐ€๋Šฅํ•œ ์ ์€ pyobj.func pyobj[:func] ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ PyCall์—๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด pyobj.func() ๋Š” ์‹ค์ œ๋กœ (pyobj.func)() ์ž…๋‹ˆ๋‹ค.

a.foo(x) ๋ฅผ foo(a, x) a.foo(x) ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋ฉด PyCall์˜ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. foo ๋Š” Julia ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹ˆ๊ณ  Julia ๋ฉ”์„œ๋“œ๊ฐ€ ๋  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„์— ๋™์ ์œผ๋กœ ์กฐํšŒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. . a.foo(x) ๋ฅผ getfield(a, Field{:foo})(x) ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ [๋˜๋Š” getfield(a, Field{:foo}, x) ]๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์—ฌ getfield{S}(::PyObject, ::Type{Field{S}}) ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋„๋กํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@JeffBezanson https://github.com/JuliaLang/julia/issues/1974#issuecomment -38837755

์—ฌ๊ธฐ์„œ ๋‹ค๋ฅธ ์šด์˜์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ธฐ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ a..b๋Š” ๊ทธ๋‹ค์ง€ ์„ค๋“๋ ฅ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‘ ์บ๋ฆญํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๋Š๋‚Œ์ด ์•„์ฃผ ... 2 ๋“ฑ์„

๋ฐ˜๋ฉด์— .. ๋Š” $ , @ ๋˜๋Š” | ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์ž…๋ ฅ๋ฉ๋‹ˆ๋‹ค. Shift ํ‚ค๋ฅผ ๋ˆ„๋ฅผ ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. , ๋‘ ๋ฌธ์ž ์ธ ๋™์•ˆ ์†๊ฐ€๋ฝ์€ ๋™์ผํ•œ ํ‚ค์— ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

@stevengj ์•„,

JavaCall์˜ ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ๋ณธ์งˆ์ ์œผ๋กœ unknownProperty ํ•ธ๋“ค๋Ÿฌ ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๊ธฐ์กด ์†์„ฑ ์ฝ๊ธฐ ๋˜๋Š” ์“ฐ๊ธฐ๋ฅผ ๋‹ค์‹œ ์“ฐ๊ฑฐ๋‚˜ ๊ฐ€๋กœ ์ฑŒ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด "x๊ฐ€ ๊ธฐ์กด ์†์„ฑ์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ax๊ฐ€ getfield (a, : x)์— ๋‹ค์‹œ ์“ฐ์—ฌ์ง„๋‹ค"๋ผ๋Š” ๊ทœ์น™์ด ๋ฌธ์ œ๋ฅผ ์ •์ƒํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ ๊นŒ์š”?

@simonbyrne , ๋งคํฌ๋กœ๋ฅผ ์š”๊ตฌํ•˜๋ฉด ๊นจ๋—ํ•˜๊ณ  ํˆฌ๋ช…ํ•œ ์–ธ์–ด ๊ฐ„ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์š•๊ตฌ๊ฐ€ type Foo; p::PyObject; end , ๊ทธ๋ฆฌ๊ณ  ๊ฐœ์ฒด์— ๋Œ€ํ•œ f::Foo ๋‹น์‹ ์ด ์›ํ•˜๋Š” foo.p.bar ๊ฒฝ์šฐ bar ํŒŒ์ด์ฌ ์†์„ฑ์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. foo.p.bar ์—์„œ ๋‘ ์ ์˜ ์˜๋ฏธ๋ฅผ ํ™•์‹คํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•  ์ˆ˜์žˆ๋Š” ๋งคํฌ๋กœ๋ฅผ ์ƒ์ƒํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ, ์Šคํƒ€์ผ์— ๋Œ€ํ•œ ํฐ ๋ฌธ์ œ๋Š” ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ณ ํ’ˆ์งˆ ํŒจํ‚ค์ง€๋Š” ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ Base ๋ฐ ๊ธฐํƒ€ ํŒจํ‚ค์ง€์˜ ์Šคํƒ€์ผ์„ ๋ชจ๋ฐฉํ•˜๊ณ  ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์—‡์„ํ•˜๋“  ์ด์ƒํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋งค๋‰ด์–ผ์˜ ๋’ท๋ถ€๋ถ„์— ๋„ํŠธ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ ์ค‘ํ•˜๊ฒŒ ์„ ํƒํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๋Š” ๊ฒฝ์šฐ (์˜ˆ : ์–ธ์–ด ๊ฐ„ ์ƒํ˜ธ ์šด์šฉ์„ฑ, ์ฝ๊ธฐ / ์“ฐ๊ธฐ ์†์„ฑ, ์•„๋งˆ๋„ factor.U ๊ฐ™์€ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์˜ค์—ผ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด) , ๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ foo[:bar] )์— ๋Œ€ํ•œ ๋” ๊นจ๋—ํ•œ ๋Œ€์•ˆ์œผ๋กœ์„œ, ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ชจ๋“  ๊ฒƒ์— ์ ์„ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ‚ค์ง€๋กœ ๋„˜์น˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ _we_๊ฐ€ ์ด๊ฒƒ์„ ๋ฌด์—‡์— ์‚ฌ์šฉํ•˜๊ณ  ๊ถŒ์žฅํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ๊ถŒ์žฅ ์‚ฌ์šฉ ๋ชฉ๋ก์„ ๋งค์šฐ ์งง๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ์‹ค์ œ ์š”๊ตฌ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งŒ ํ™•์žฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

type Foo; bar(...) = ....; end ์— foo.bar(...) type Foo; bar(...) = ....; end ์™€ ๊ฐ™์ด ๋งค์šฐ ์‰ฌ์šด OO์™€ ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ดˆ๋ณด์ž์—๊ฒŒ๋„ ์œ ํ˜น์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

์ €๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ @stevengj ์™€ ์™„์ „ํžˆ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‹ค์ œ ํ˜„์žฅ ์ ‘๊ทผ์„ ์œ„ํ•ด a..b ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

  1. a.b ์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.
  2. ๋œ ํŽธ๋ฆฌํ•ด์•ผํ•˜๋ฏ€๋กœ
  3. ๋œ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ธฐ์กด์˜ ์˜๋ฏธ๊ฐ€ ์—†์œผ๋ฉฐ 1 ๋…„ ๋„˜๊ฒŒ ๊ฐ•๋ ฅํ•œ ์šฉ๋„๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
  5. a b`์ฒ˜๋Ÿผ ๋”์ฐํ•˜๊ฒŒ ์ด์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

์ด ๋ณ€๊ฒฝ์œผ๋กœ (https://github.com/JuliaLang/julia/issues/2403) ๊ฑฐ์˜ ๋ชจ๋“  Julia์˜ ๊ตฌ๋ฌธ์ด ์˜ค๋ฒ„๋กœ๋“œ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? (์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋Š” ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค.) ๊ฑฐ์˜ ๋ชจ๋“  ๊ตฌ๋ฌธ์ด ์˜ค๋ฒ„๋กœ๋“œ ๊ฐ€๋Šฅํ•œ ๋ฉ”์„œ๋“œ ๋””์ŠคํŒจ์น˜๋กœ ๋‚ฎ์•„์ง„๋‹ค๋Š” ๊ฒƒ์€ ์ €์—๊ฒŒ ๊ฐ•๋ ฅํ•œ ํ†ตํ•ฉ ๊ธฐ๋Šฅ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ ์ผ์ข…์˜ ๋‹จ์ˆœํ™”๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์‚ผํ•ญ ์—ฐ์‚ฐ์ž์™€ && ๋ฐ || ๋Š” ์‹ค์ œ๋กœ ์ œ์–ด ํ๋ฆ„์ด๋ฏ€๋กœ ์•ฝ๊ฐ„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ์ฃผ์žฅ์€ a..b ๋ฅผ ์‹ค์ œ ํ•„๋“œ ์•ก์„ธ์Šค๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ดํ›„๋กœ _that_์€ ์˜ค๋ฒ„๋กœ๋“œ ๋ถˆ๊ฐ€๋Šฅํ•œ ์œ ์ผํ•œ ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์ข‹์€ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ผ๊ด€์„ฑ์€ ์ข‹์ง€๋งŒ ๊ทธ ์ž์ฒด๋กœ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์˜ค, ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ์ง€ ์•Š๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์žŠ์–ด ๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ฌธ์ œ # 2403์ด ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋„ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์ผ์–ด๋‚˜๋Š” ์ผ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

์€ ์—ฌ๊ธฐ ๋‚˜๋ฅผ ์œ„ํ•ด ์˜ฅ์— ํ‹ฐ๋Š” ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์‹ค์ œ ํ•„๋“œ ์•ก์„ธ์Šค ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ •๋ง ์ข‹์€ ๊ฒƒ์ด๋ผ๊ณ , ๊ทธ๋Ÿฌ๋‚˜ ์•„๋ฌด๋„ ์“ฐ๊ณ  ์‹ถ์–ดํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฒƒ์„ ์•„๋งˆ ์ผ์–ด๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค Package..foo .

์ ์ด ์กฐ๊ธˆ๋ณด๊ธฐ ํ‰ ํ•ด์ง€๋ฉด ํƒญ ์™„์„ฑ; ๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” x. ๋ฉ”์„œ๋“œ๊ฐ€ ์–ด๋–ค ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐœ์ฒด ํ•„๋“œ ์ด๋ฆ„์ด๋‚˜ ๋ชจ๋“ˆ ์ด๋ฆ„์„ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•œ ์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„๋ฌด๋„ getfield(::Module, ...) ์ •์˜ํ•˜๋ ค๊ณ ํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ํƒญ ์™„์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. foo.<tab> ์—๋Š” "๊ณต์šฉ ํ•„๋“œ"๊ฐ€ ๋‚˜์—ด๋˜๊ณ  foo..<tab> ์—๋Š” "๊ฐœ์ธ ํ•„๋“œ"๊ฐ€ ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์˜ ๊ฒฝ์šฐ Mod.foo ์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„์„ Mod..foo ํ•˜๊ณ  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ Module ์— getfield ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ๋ง๋ผ๊ณ  ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด ๊ดœ์ฐฎ์Šต๋‹ˆ๊นŒ? ๋‚ด ๋ง์€, ๋‹น์‹ ์€ ์ด๋ฏธ ์ •์ˆ˜ ๋ง์…ˆ์„ ์–ธ์–ด์—์„œ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค โ€“ ๋ชจ๋“  ์ง€์˜ฅ์ด ํ’€๋ฆฌ๊ณ  ๋‹น์‹ ์€ segfault๋ฅผ ์–ป์ง€ ๋งŒ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๋ง‰์œผ๋ ค ๊ณ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ณด๋‹ค ๋” ๋‚˜์  ์ˆ˜๋Š” ์—†์ฃ ?

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ์‹ค์ œ๋กœ ์ด๋ฆ„ ์ง€์ •์—๋งŒ ๊ด€์‹ฌ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์‹ค ๊ทธ๋ณด๋‹ค ์•ฝ๊ฐ„ ๋” ๋‚˜์ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ •์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ๋งŽ์ง€ ์•Š์ง€๋งŒ Mod.foo ๊ธฐ๋ณธ๊ฐ’์„ Mod..foo ๋กœ ์„ค์ •ํ•˜์ง€๋งŒ ์ผ๋ถ€ ์œ„์น˜์—์„œ๋Š” ๋ถ€ํŠธ ์ŠคํŠธ๋žฉ์— Mod..foo ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. .. ์—ฐ์‚ฐ์ž๊ฐ€ ์—†์œผ๋ฉด ๋Œ€์ฒด๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด Core.getfield ๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜๋„ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์œผ๋กœ, ์šฐ๋ฆฌ๋Š” ์•„๋งˆ ์ œ๊ฑฐ ํ•  ๊ฒƒ Core.getfield ๋งŒ์ด .. .

๊ทธ๊ฒƒ์€ ๊ณต์ •ํ•œ ์š”์ ์ž…๋‹ˆ๋‹ค โ€“ ๋ช…๋ช…์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ผ์ข…์˜ ํฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค :-). ์ข‹์€ ๋ฐฉ๋ฒ• ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. .. ์žˆ๊ณ  Core.getfield .

์ด ๋‘ ๊ฐ€์ง€ ์•„์ด๋””์–ด,

[...] ๋งค๋‰ด์–ผ์˜ ๋’ท๋ถ€๋ถ„์— ๋„ํŠธ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ๋„ฃ๊ณ  ์‹ ์ค‘ํ•˜๊ฒŒ ์„ ํƒํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค @stevengj https://github.com/JuliaLang/julia/issues/1974#issuecomment -38847340

๊ณผ

[...] ๊ธฐ๋ณธ ์„ค์ •์€ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์ด x.property ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. https://github.com/JuliaLang/julia/issues/1974#issuecomment -38694885

๋ถ„๋ช…ํžˆ ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์•„์ด๋””์–ด๋ฅผ ์„ ํƒํ•˜๋ ค๋ฉด "์‹ ์ค‘ํ•˜๊ฒŒ ์„ ํƒํ•œ ์‚ฌ๋ก€"์— ๋Œ€ํ•ด ์ƒˆ .. ์—ฐ์‚ฐ์ž๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋” ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์žฅ์  ์‚ฌ์šฉ์œผ๋กœ ..name ํ˜„์žฌ ๊ฒฝ์šฐ์— [:name] ์‚ฌ์šฉ (DataFrames๋Š”, DICT๋Š” {๊ธฐํ˜ธ, ...}) ๊ฒƒ๋ณด๋‹ค ์ž…๋ ฅ / ๊ตฌ๋ฌธ ๋ช…ํ™• ํ•„๋“œ ์•ก์„ธ์Šค์—์„œ ํ•ด๋‹น ๋ญ”๊ฐ€ ๋‹ค๋ฅธ ์ง„์ˆ  ์นœํ™”์  ๋™์•ˆ ์ผ์–ด๋‚˜๊ณ  ์žˆ์—ˆ๋‹ค. ๋˜ํ•œ ..name ์˜ ์ด์ค‘ ์ ์€ ํšŒ์ „ ๋œ ์ฝœ๋ก , :name ๊ธฐํ˜ธ ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ํžŒํŠธ๋กœ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํƒญ ์™„์„ฑ์—๋„ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๋‹จ์ ์œผ๋กœ PyCall et al. ์›๋ž˜ ๊ตฌ๋ฌธ์— ๋„ˆ๋ฌด ๊ฐ€๊น์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  . ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํ˜ผ๋™ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค). ํ•˜์ง€๋งŒ ์†”์งํžˆ ๋งํ•ด์„œ Julia๋Š” Python ๊ตฌ๋ฌธ๊ณผ ์™„์ „ํžˆ ํ˜ธํ™˜๋˜์ง€ ์•Š์œผ๋ฉฐ Python์—์„œ ๊ฐ„๋‹จํ•œ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด PyCall์„ ์‚ฌ์šฉํ•˜์—ฌ Julia์— ๋งŽ์ด ์ž…๋ ฅํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ•ญ์ƒ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. .. ๋ฅผ ์—๋ฎฌ๋ ˆ์ดํŠธํ•˜๋Š” . ๋Š” ์—ฌ๊ธฐ์—์„œ ์ข‹์€ ๊ท ํ˜•์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์˜คํ•ดํ•˜์ง€ ๋งˆ์„ธ์š”. ์ €๋Š” PyCall์„ ์ •๋ง ์ข‹์•„ํ•˜๊ณ  ํŠน๋ณ„ํ•œ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•œ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค)

๋‚ด๊ฐ€ ํ˜„์žฌ ์„ ํ˜ธํ•˜๋Š” ๋‘ ๋ฒˆ์งธ ์•„์ด๋””์–ด๋Š” property(x) ๋˜๋Š” x.property ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”์‹œ๊ธฐ์— ๋Œ€ํ•œ ํฐ ๊ฒฐ์ •์„ ๋‚ด ๋ ธ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒƒ์ด ์กด์žฌํ•œ๋‹ค๋ฉด ์šฐ์•„ํ•˜๊ณ  ๋ช…ํ™•ํ•˜๊ณ  ๋ช…ํ™•ํ•œ ์ •์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค .. .
์‚ฌ๋žŒ๋“ค์ด ์˜ค๋ฒ„๋กœ๋“œ ๊ฐ€๋Šฅํ•œ . ์„ ์›ํ•œ๋‹ค๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ x.property API ์Šคํƒ€์ผ์„ ์„ ํ˜ธํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์–ด์จŒ๋“  . ์˜ค๋ฒ„๋กœ๋“œ ๊ฐ€๋Šฅํ•œ ํ•„๋“œ ์•ก์„ธ์Šค ์—ฐ์‚ฐ์ž๊ฐ€ ์•„๋‹ˆ๋ผ ์˜ค๋ฒ„๋กœ๋“œ ๊ฐ€๋Šฅํ•œ "์†์„ฑ"์•ก์„ธ์Šค ์—ฐ์‚ฐ์ž ( getprop(a, Field{:foo}) ์–ด์ฉŒ๋ฉด?)๋กœ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ ์˜ค๋ฒ„๋กœ๋“œ ํ•  ์ˆ˜์—†๋Š” ํ•„๋“œ ์—ฐ์‚ฐ์ž ..
๋‹ค๋ฅธ ๊ฒฐ์ •๋„ ์ทจํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•„๋“œ ์•ก์„ธ์Šค๋ฅผ์œ„ํ•œ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„ ์ฝ”๋“œ์—์„œ .. ๋˜๋Š” . ? ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฒ”์œ„ ๋‹จ๊ณ„ ์˜ˆ์˜ ๊ฒฝ์šฐ ์–ด๋–ค ๊ฒƒ์ด ๊ด€์šฉ์ ์ž…๋‹ˆ๊นŒ? step(r::Range1) = one(r..start) ๋˜๋Š” step(r::Range1) = one(r.start) ? ( step ๊ฐ€ ๋ฉ”์„œ๋“œ ๋˜๋Š” ์†์„ฑ์ด์–ด์•ผํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์€ ๋งํ•  ๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค.)

์ด๊ฒƒ์ด ์ œ๊ฐ€ ๊ทธ ๊ฐ๋„์—์„œ ๋ฌผ๋Ÿฌ์„œ์„œ ๋‹ค์Œ ๊ธฐ์ค€์„ ์ œ์•ˆํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค : https://github.com/JuliaLang/julia/issues/1974#issuecomment -38812139.

์ด ํฅ๋ฏธ๋กœ์šด ๊ธ€์„ ์ฝ๋Š” ๋™์•ˆ ๋จธ๋ฆฟ์†์— ๋– ์˜ค๋ฅธ ์ƒ๊ฐ์ด ํ•˜๋‚˜๋ฟ์ž…๋‹ˆ๋‹ค. ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” ๊ณต์šฉ ํ•„๋“œ๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ํ•„๋“œ๋Š” ์ •์˜ ๋ชจ๋“ˆ ๋‚ด์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ :

module Foo
   type Person
     name
     age
   end
   export Person, Person.name
   <strong i="6">@property</strong> Person :age(person) = person..age + 1
end

์ด ์ƒํ™ฉ์—์„œ ๋‚ด ๋ณด๋‚ธ Person์€ ์—ฌ์ „ํžˆ โ€‹โ€‹'name'๊ณผ 'age'์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.์ด ๊ฒฝ์šฐ age๋Š” ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ฝ๊ธฐ ์ „์šฉ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  Person ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” export Person. * ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์œผ๋กœ ์ˆ˜ํ–‰ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[pao : ์ธ์šฉ๊ตฌ]

@emeseles ์ค„๋ฆฌ์•„ ์ฝ”๋“œ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ธ์šฉ ํ•  ๋•Œ ๋ฐฑํ‹ฑ์„ ์‚ฌ์šฉํ•˜๋„๋ก์ฃผ์˜ํ•˜์‹ญ์‹œ์˜ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ์„œ์‹์ด ์œ ์ง€๋˜๊ณ  Julia์˜ ๋งคํฌ๋กœ๊ฐ€ ๋น„์Šทํ•œ ์ด๋ฆ„์˜ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ GitHub ์•Œ๋ฆผ์„ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

. ๋ฐ .. ์€ (๋Š”) ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋ช…ํ™•ํ•˜๊ณ  ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฌ์šด ์‹ ํƒ์Šค๋Š” ์ข‹์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์ •๋ง๋กœ ๊ณ ๋Œ€ํ•˜๊ณ ์žˆ๋‹ค. ์ด๊ฒƒ์€ 0.4 ํ”„๋กœ์ ํŠธ๋กœ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด (๋˜๋Š” # 5848์˜ WIP) ์ถฉ๋ถ„ํžˆ ํฐ ๋ณ€๊ฒฝ์ž…๋‹ˆ๊นŒ?

๋„ค, ํ™•์‹คํžˆ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ ๋Œ€๋ถ€๋ถ„์ด ์ ์–ด๋„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ถŒ์žฅ๋˜๋Š” ์‚ฌ์šฉ์„ ์ œํ•œํ•ด์•ผํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ๋Š๋‚Œ์€ ์ฒ˜์Œ์—๋Š” ์ƒํ˜ธ ์šด์šฉ์„ฑ (PyCall์—์„œ์™€ ๊ฐ™์ด ๋‹ค๋ฅธ ์–ธ์–ด์™€์˜ ์‚ฌ์šฉ, ์  ํ‘œ๊ธฐ๋ฒ•์ด ์ž์—ฐ์Šค๋Ÿฌ์šด ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)๊ณผ ์•„๋งˆ๋„ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ( get_foo(x) ์ดํ›„)์˜ ๋‘ ๊ฐ€์ง€ ์šฉ๋„๋กœ๋งŒ ๊ถŒ์žฅ๋˜์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. set_foo!(x, val) ์€ ์ถ”ํ•ฉ๋‹ˆ๋‹ค).

์™ธํ™” ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ์œ„ํ•ด์„œ๋งŒ ๊ถŒ์žฅํ•˜๋”๋ผ๋„ ๊ทธ ๋ชฉ์ ๋งŒ์œผ๋กœ๋„์ด ๊ธฐ๋Šฅ์„ ์ •๋‹นํ™”ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. Julia์™€ ๊ฐ™์€ ์ƒˆ๋กœ์šด ์–ธ์–ด์˜ ๊ฒฝ์šฐ ๋‚˜๋จธ์ง€ ์†Œํ”„ํŠธ์›จ์–ด ์„ธ๊ณ„์™€ ์›ํ™œํ•˜๊ฒŒ ๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

Steven, ์ €๋Š” getter / setter์— ๋Œ€ํ•ด 100 % ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ณง ๋ถˆ์ผ์น˜๋กœ ์ด์–ด์งˆ ๊นŒ๋ด ๋‘๋ ต์ง€ ๋งŒ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€์—๋Š” ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์œ„์— Gtk.jl ๋™์  ์†์„ฑ์—๋Š” ๊ตฌ๋ฌธ์˜ ์ด์ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ์€ Stefan์ด # 5842์—์„œ ์„ค๋ช…ํ•œ ์—ด๊ฑฐ ํ˜• ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค.

์ถฉ๋Œ. ์ด ๋ฌธ์ œ์˜ ์ง„ํ–‰์„ ๋ฐฉํ•ดํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ฒฐ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด์ด ๋ฌธ์ œ๊ฐ€ ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ๋‹ค๋ฅธ ๋‚ด๋ถ€ ๋ณ€๊ฒฝ์— ์˜์กดํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋‹จ์ง€ ์ฝ”๋”ฉ์ž…๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ์˜ ์ง„ํ–‰์„ ๋ฐฉํ•ดํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ผ์„ํ•˜๋Š” ์‚ฌ๋žŒ๊ณผ ๊ทธ๊ฒƒ์ด ์˜ณ์€ ์ผ์ธ์ง€์— ๋Œ€ํ•œ ์•ฝ๊ฐ„์˜ ๋ง์„ค์ž„.

@ihnorton์€ ์ด๋ฏธ # 5848์—์„œ ์ดˆ๊ธฐ ์ดˆ์•ˆ ๊ตฌํ˜„์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ธ์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ Julia ํ•ต์‹ฌ ํŒ€์˜ ๋ช…ํ™•ํ•œ ์ง„์ˆ ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ๋กœ ์ž‘์—…์ด ์ค‘๋‹จ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์œผ๋กœ ์Šน์„ ํ•˜๊ณ ์žˆ๋‹ค. @JeffBezanson ์ด ์šธํƒ€๋ฆฌ์—์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ €์—๊ฒŒ๋Š”์ด ๊ธฐ๋Šฅ์ด ์žˆ์œผ๋ฉด ๋Œ€๊ทœ๋ชจ Python ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ Julia๋กœ ์‰ฝ๊ฒŒ ์ „ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•™์ƒ๋“ค์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ต์ˆ™ํ•œ ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š”์ด ์Šค๋ ˆ๋“œ์—์„œ ์œ„์˜ ๋…ผ์˜๋ฅผํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์™„์ „ํ•œ ํ•ฉ์˜๋ฅผ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ช‡๋ช‡ ์‚ฌ๋žŒ๋“ค์€ ๊ณต์šฉ API๊ฐ€ ํ•จ์ˆ˜ / ๋ฉ”์†Œ๋“œ๋กœ ๊ตฌ์„ฑ๋˜๊ณ  ๊ฐœ์ธ API๋Š” ๋ณตํ•ฉ ์œ ํ˜•์˜ ํ•„๋“œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณ„ํš์—์„œ ๋งค์šฐ ๋“œ๋ฌธ ์˜ˆ์™ธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (LU ๋ถ„ํ•ด์—์„œ .U ?)

ํŒŒ์ด์ฌ ์•ก์„ธ์Šค์™€ ์—ด๊ฑฐ ํ˜•์ด ์œ ์šฉํ•œ ๊ฒฝ์šฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ๋ฐ˜๋Œ€ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์—ฌ๊ธฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๊ธด๊ธ‰ํ•œ์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœ์ฃผ๊ธฐ๊ฐ€ ๋๋‚  ๋•Œ ์ด๊ฒƒ์„ ๋ฐ€์–ด ๋ถ™์ด๋Š” ๊ฒƒ์ด ํ˜„๋ช…ํ•œ ์ง€ ์˜๋ฌธ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ ufechner7 , ์ฃผ์š” ๋™๊ธฐ๊ฐ€ ์–ธ์–ด ๊ฐ„ ์ƒํ˜ธ @tknopp , ์šฐ๋ฆฌ๋Š” ์ด์™€ ๊ฐ™์€ ๊ฒƒ์— ๋Œ€ํ•ด ๋งŒ์žฅ์ผ์น˜๋กœ ํ•ฉ์˜ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ถ๊ทน์ ์œผ๋กœ @JeffBezanson ๊ณผ @StefanKarpinski๊ฐ€ ๊ฒฐ์ •ํ•˜๋Š”

๋งŽ์€ ๋ง์„ค์ž„์ด Jeff์˜ ์ตœ์•…์˜ ์•…๋ชฝ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์—์„œ ๋น„๋กฏ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

module DotOrientedProgramming
  Base.getfield(x, ::Field{:size}) = size(x)
  Base.getfield(x, ::Field{:length}) = length(x)
  โ‹ฎ
end

์ €๋„ ์ด๊ฒƒ์„ ๋งค์šฐ ์‹ซ์–ดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์˜ค์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ํŒจํ‚ค์ง€๋Š” ์ €๋ฅผ ํฌํ•จํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ _all_ ์œ ํ˜•์— ์˜ค์šฉ์„ ๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๋งค์šฐ ๊ฐ•๋ ฅํ•˜๋ฉฐ Julia๊ฐ€ ์ž‘์„ฑ๋˜๋Š” ๋ฐฉ์‹์„ ๋ฐ”๊ฟ€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋” ์ข‹๊ฒŒ, (์•„๋งˆ๋„ ์ข‹์ง€๋งŒ) ๋‚˜์˜๊ฒŒ.

์˜ˆ, ์Šคํ‹ฐ๋ธ, ์ œ ๋ง์ด ์ ์ ˆํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋งํ•˜๊ณ  ์‹ถ์—ˆ๋˜ ์š”์ ์€์ด ๋ณ€ํ™”๊ฐ€ ์–ธ์–ด๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐœ์ „ ํ•  ๊ฒƒ์ธ์ง€์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฅธ ์ด์Šˆ์—์„œ ๊ฐ€์ง€๊ณ ์žˆ๋Š” "๊ณต์‹์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค"์•„์ด๋””์–ด๋Š” . ์˜ค๋ฒ„๋กœ๋“œ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์˜ํ–ฅ๋„๋ฐ›์Šต๋‹ˆ๋‹ค. ์˜ˆ, @JeffBezanson ๊ณผ @StefanKarpinski๊ฐ€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ๋ฌธ์ œ๋Š” ๊ฒฐ์ •์ด ์ง€๊ธˆ ์‹œํ–‰๋˜์–ด์•ผํ•˜๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค ...

๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๊ตฌ๋ฌธ์„ ์˜ค๋ฒ„๋กœ๋“œ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ๋ฌธํ™”์— ์˜์กดํ•˜์—ฌ ๋„ˆ๋ฌด ์•ผ์ƒ์— ๋น ์ง€์ง€ ์•Š๋„๋กํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ–ˆ์Šต๋‹ˆ๋‹ค.

+1 . ์—ฌ๊ธฐ์— call ์˜ค๋ฒ„๋กœ๋”ฉ์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ์ฒ ํ•™์  (๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ์‹ค์šฉ์ ์ธ ...) ์•„๋‚ ๋กœ๊ทธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์„ค๋ช…์„œ์—๋Š” Don't do stupid stuff: we won't optimize that ์„น์…˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. (๋ฌผ๋ก , call ์˜ค๋ฒ„๋กœ๋”ฉ์€ ์„ฑ๋Šฅ์ƒ์˜ ์ด์œ ๋กœ ๋ถ€๋ถ„์ ์œผ๋กœ _for_ํ–ˆ์ง€๋งŒ ๋‚จ์šฉ์˜ ๊ฐ€๋Šฅ์„ฑ์ด ๋งŒ์—ฐํ•ฉ๋‹ˆ๋‹ค.)

  • : 100 : ๊ทธ๊ฒƒ์—. ์ €๋Š” ๋ฌธํ™”๊ฐ€ ์ด๊ฒƒ์„ ๋‚จ์šฉํ•˜์ง€ ์•Š๋„๋ก ์ถฉ๋ถ„ํ•œ ๋™๊ธฐ๊ฐ€๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค

์ „๋ฐ˜์ ์œผ๋กœ ๋‚˜๋Š” ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ•™๋Œ€ ๊ฐ€๋Šฅ์„ฑ์ด ๊ฐ€์žฅ ํฐ ๊ฑฑ์ •์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ํฐ ๋ฌธ์ œ๋Š”

  • "์‹ค์ œ"ํ•„๋“œ ์•ก์„ธ์Šค์— ํ—ˆ์šฉ๋˜๋Š” ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” a..b ๊ทธ๋‹ค์ง€ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋“ˆ. ์ •๊ทœํ™” ๋œ ์ด๋ฆ„์€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ ๋””์ŠคํŒจ์น˜๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์‹ค์งˆ์ ์ธ ์–ด๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ •๊ทœํ™” ๋œ ์ด๋ฆ„์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์ปดํŒŒ์ผ๋Ÿฌ ๋‹จ๊ณ„ (์•„๋งˆ๋„ ์ธ๋ผ์ธ์„ ํ†ตํ•ด)๋ฅผ ๊ฑฐ์ณ์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ AST๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์‚ถ์„ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋Ÿฌํ•œ ๋„๊ตฌ์—์„œ์ด ๊ฒฝ์šฐ๋ฅผ ์ž˜๋ชป ์ฒ˜๋ฆฌํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘์— ๋Œ€ํ•ด ๋™์ผํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•œ ๋ฒˆ์— ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ์ด ์‹œ์ ์—์„œ ๋ชจ๋“ˆ์— ๋Œ€ํ•ด . ์ด์™ธ์˜ ๋‹ค๋ฅธ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. _ ๋‚ด๋ถ€์ ์œผ๋กœ _ ๋ชจ๋“ˆ ์ฐธ์กฐ๋ฅผ์œ„ํ•œ ์ถ”์ƒ ๊ตฌ๋ฌธ์ด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ๋“œ๋Ÿฌ ๋‚ผ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ์‹ค๋ง ์Šค๋Ÿฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‚˜์˜ ๋‘ ์„ผํŠธ : ์™œ ์ž๊ฒฉ์žˆ๋Š” ์ด๋ฆ„์— : ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์ด๋ฏธ ๋น„์Šทํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค.

import Base: call, show, size

์ด๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

module Foo
    module Bar
        f(x) = 3*x
    end
    const a = 42
end

<strong i="10">@assert</strong> Foo:a == 42

Foo:Bar:f(789)

์•„๋‹ˆ๋ฉด ์ด๋ฏธ : ๊ธฐํ˜ธ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? :: ๊ธฐํ˜ธ (C ++ ์Šคํƒ€์ผ)๋Š” ๋‚˜์—๊ฒŒ ๋„ˆ๋ฌด ์žฅํ™ฉํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

: ๋Š” ์ด๋ฏธ Julia์—์„œ ๊ฐ€์žฅ ๊ณผ๋ถ€ํ•˜ ๋œ ๊ธฐํ˜ธ์ด๋ฏ€๋กœ ๋„์›€์ด๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

module.name ์„ (๋ฅผ) ์˜ค๋ฒ„๋กœ๋“œ ํ•  ์ˆ˜ ์—†๋„๋ก ๋งŒ๋“ค์–ด ์ •๊ทœํ™” ๋œ ๋ช…๋ช… ๋ฌธ์ œ๋ฅผ ๋‹จ์ˆœํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ชจ๋“ˆ ๋ฐ”์ธ๋”ฉ์€ ์ผ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•œ ์˜๋ฏธ๋ฅผ ์œ ์ง€ํ•˜์ง€๋งŒ a.b ์˜ LHS๊ฐ€ ๋ชจ๋“ˆ์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ๋˜๋Š” ์ฆ‰์‹œ ์ •๊ทœํ™” ๋œ ์ด๋ฆ„ ์กฐํšŒ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ผ๋ฐ˜ ๋…ผ๋ฆฌ๋ฅผ ๋‹จ๋ฝ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ๋ชจ๋“ˆ์—์„œ ์ด๋ฆ„์„ ์ฐพ๋Š” ๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ๋ฌด์‹œํ•˜๋„๋ก ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ฝค ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ํ•„๋“œ ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•ด a..b ๊ตฌ๋ฌธ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๋‹น์‹ ์˜ ๋ฐ˜๋Œ€๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ณ์— : ์ผ๋ถ€ ๊ธฐ๋Šฅ ์–ธ์–ด์™€ ๊ฐ™์€ ๊ฐ€์ ธ ์˜ค๊ธฐ ๋ชฉ๋ก์— ๋Œ€ํ•ด ( ) ๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋ฉดํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ :

import Base (call, show, size)

๋‚ด ์ด์œ ๋Š” ์‰ผํ‘œ๋ฅผ ์„ ํƒ ์‚ฌํ•ญ์œผ๋กœ ๋งŒ๋“ค๊ณ  ํ›„ํ–‰ ์‰ผํ‘œ๋ฅผ ํ—ˆ์šฉ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜จ ๋ชจ๋“  ์ด๋ฆ„์— ๋งˆ์ง€๋ง‰ ์‰ผํ‘œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋งˆ์ง€๋ง‰ ์‰ผํ‘œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์ด ์ •๋ง ์งœ์ฆ๋‚ฉ๋‹ˆ๋‹ค.

์˜ˆ, ์ €๋Š” a.b ๊ฐ€ " a ๊ฐ€ ๋ชจ๋“ˆ์ด๋ฉด ๋จผ์ € ๋ชจ๋“ˆ ์กฐํšŒ๋ฅผ ์ˆ˜ํ–‰"์„ ์˜๋ฏธํ•˜๋„๋ก ๋งŒ๋“ค ๊ฐ€๋Šฅ์„ฑ์„ ์–ธ๊ธ‰ํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ชจ๋“ˆ ์กฐํšŒ์˜ ์˜๋ฏธ๋ฅผ ์žฌ์ •์˜ํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ getfield(a,:b) ํ˜ธ์ถœ๋กœ a.b ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„์˜ ๋ณต์žก์„ฑ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์•”์‹œ ์  ๋ถ„๊ธฐ๊ฐ€์žˆ๋Š” ํŠน์ˆ˜ AST ๋…ธ๋“œ ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์šฐ๋ฆฌ๋Š” _explicit_ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‚˜๋Š” ๊ทธ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ AST ํŒฝ์ฐฝ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ”„๋ŸฐํŠธ ์—”๋“œ์™€ ๋ฐฑ ์—”๋“œ์˜ ์š”๊ตฌ ์‚ฌํ•ญ ์‚ฌ์ด์— ์ด๋Ÿฌํ•œ ํฐ ๊ฐˆ๋“ฑ์„ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์€์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด a..b ์ข‹์•„ํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ์œผ๋กœ ์‚ฌ๋Š” ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”. ๊ทธ๊ฒƒ์€ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ฐ„๊ฒฉ.

๋‚˜๋Š” a..b ๋„ ์‹ซ์–ดํ•˜์ง€๋งŒ ์™œ ๊ทธ๊ฒƒ์ด ํ•„์š”ํ•œ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์„ ๋•Œ ์˜ค๋ฒ„๋กœ๋”ฉ์€ ์‹ค์ œ ํ•„๋“œ ์•ก์„ธ์Šค๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์–ธ์–ด ๋ž˜ํผ ๋ฐ ๋™์  ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ์ธ์ƒ์„๋ฐ›์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ์‹œ์ ์—์„œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๊ฐ์ฒด์˜ ํ‘œํ˜„์— ์•ก์„ธ์Šคํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ƒ๋Œ€์ ์œผ๋กœ ๋“œ๋ฌผ๊ณ  get_actual_field(a,:x) ์ฒ˜๋Ÿผ ์ถ”์•… ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ฃผ์žฅ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์€ ๊ตฌ๋ฌธ์„ ๊ฐ–์ง€ ์•Š๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์ค‘์š”ํ•œ ์—ฐ์‚ฐ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์•Œ์ง€๋งŒ ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์•„๋ฌด๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ๊ตฌ๋ฌธ์„ ์ฐพ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๋‚˜์š”?

.. ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ๋™์  ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ์˜ˆ๋ผ๊ณ  ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ์•„๋‹ˆ์˜ค๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋„ํŠธ ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์„์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค. ์œ„์˜ @mbauman ์˜ˆ์ œ๋ฅผ ๊ณ„์† ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

a..b ๊ตฌ๋ฌธ์€ ์ผ์ข…์˜ ๊ฐ„๊ฒฉ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ (์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค) ๊ฐ„๊ฒฉ ์‚ฐ์ˆ ์—๋Š” ์ž์ฒด ์ž…๋ ฅ ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Interval(a,b) ๊ฒƒ์€ ๊ดœ์ฐฎ์•„์š”. ์ง€๊ธˆ๊นŒ์ง€ ์ค„๋ฆฌ์•„์—์„œ ์—ฐ์‚ฐ์ž๋กœ ์‚ฌ์šฉ๋˜์–ด ์™”๊ณ  ๋ˆ„๊ตฌ๋„ ๊ทธ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ์‚ฌ๋žŒ์ด ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•„๋“œ ์•ก์„ธ์Šค์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•œ ๊ฐ€์ง€ ์€์ƒ‰ ์•ˆ๊ฐ์€ ์šฐ๋ฆฌ๊ฐ€ ๋”์ฐํ•œ module_name ์„ m..name ๋Œ€์ฒด ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Module ๊ฐ์ฒด์˜ ํ•„๋“œ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์€ ์‚ฌ๋งˆ๊ท€์˜€์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์ €๋Š” a.b ๊ฐ€ " a ๊ฐ€ ๋ชจ๋“ˆ์ด๋ฉด ๋จผ์ € ๋ชจ๋“ˆ ์กฐํšŒ๋ฅผ ์ˆ˜ํ–‰"์„ ์˜๋ฏธํ•˜๋„๋ก ๋งŒ๋“ค ๊ฐ€๋Šฅ์„ฑ์„ ์–ธ๊ธ‰ํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ชจ๋“ˆ ์กฐํšŒ์˜ ์˜๋ฏธ๋ฅผ ์žฌ์ •์˜ํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ getfield(a,:b) ํ˜ธ์ถœ๋กœ a.b ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„์˜ ๋ณต์žก์„ฑ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์•”์‹œ ์  ๋ถ„๊ธฐ๊ฐ€์žˆ๋Š” ํŠน์ˆ˜ AST ๋…ธ๋“œ ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์šฐ๋ฆฌ๋Š” _explicit_ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‚˜๋Š” ๊ทธ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ AST ํŒฝ์ฐฝ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ํ•จ์œผ๋กœ์จ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ a.b ๋ฌด์กฐ๊ฑด ํ‰๊ท  getfield(a,:b) ๊ทธ๊ฒƒ์€ ์˜ค๋ฅ˜๊ฐ€์— ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋‹ค์Œ๊ณผ getfield ๊ทธ ๊ต์ฐจ getfield(::Module, ::Field) ๋ฐฉ๋ฒ•์€? ๊ทธ ํ–‰๋™์„ ๊ฐ•์š”ํ•˜๋Š” ์ผ์ข…์˜ ์ด์ƒํ•œ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ๊ถ๊ทน์ ์œผ๋กœ ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ๊ฐ€์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‚ฎ์ถ”๋Š” ๊ฒƒ์€ ๋‹น์‹ ์ด ์†์ž„์ˆ˜๋ฅผ ์“ฐ๊ฑฐ๋‚˜ ์ž๊ฒฉ์„ ๊ฐ–์ถ˜ ์ด๋ฆ„ ์กฐํšŒ๋กœ module.name ๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์—†๋‹ค๋Š” ์‚ฌ์‹ค์„ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ข‹์•„, ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.์ด ์Šค๋ ˆ๋“œ์˜ ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ .. ํ•˜๊ณ  ๊ทธ๋ ‡๋‹ค๋ฉด ๋ชจ๋ฒ”์  ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? (์ฆ‰, ๋‚ด๋ถ€ ํ•„๋“œ ์•ก์„ธ์Šค๋ฅผ ์™„์ „ํžˆ ์„€๋„ ์ž‰ํ•ด๋„ ๊ดœ์ฐฎ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค)

@StefanKarpinski ์˜ˆ, ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ผ์ข…์˜ "๋ฐ€๋ด‰ ๋œ"๋ฐฉ๋ฒ•์„ ์›ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@tknopp ์•ก์„ธ์Šค module..name ๋ฐ module..parent :) ๋˜ํ•œ ๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด ์ €์ˆ˜์ค€ ํ•„๋“œ ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•ด get(obj,:field) ์™€ ๊ฐ™์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ตฌ๋ฌธ์„ ์˜นํ˜ธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์•„๋‹ˆ์š” ์ €๋Š” ํŠน์ • ๊ตฌ๋ฌธ์„ ์˜นํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ ์ด์œ ์™€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋™์  ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ๊ฒฝ์šฐ

  • a.b ์€ Base.getfield(a, ::Field{:b}) ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ•„๋“œ ์•ก์„ธ์Šค์ž…๋‹ˆ๋‹ค.
  • a.b Base.getfield(a, ::Field{:b}) ๊ฐ€ ์ •์˜ ๋œ ๊ฒฝ์šฐ a.b ๋Š” ๋™์  ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์‹ค์ œ ํ•„๋“œ ์•ก์„ธ์Šค๊ฐ€ ๊ฐ€๋ ค ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์งˆ๋ฌธ์€ ์„€๋„ ์ž‰์ด ์ข‹์ง€ ์•Š์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์˜€์Šต๋‹ˆ๋‹ค.

์˜ˆ; pyobject.x ์„ ์ •์˜ํ•˜์—ฌ x ๋ชจ๋“  x ๋Œ€ํ•ด ํ•ญ์ƒ pyobject์˜ ์‚ฌ์ „์—์„œ ์กฐํšŒ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ pyobject์˜ julia ํ•„๋“œ์— ์•ก์„ธ์Šคํ•˜๋ ค๋ฉด ๋ณ„๋„์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Ahhh, ๊ทธ๋ž˜์„œ ์ „๋ถ€ ์•„๋‹ˆ๋ฉด ์•„๋ฌด๊ฒƒ๋„? ์–ด๋–ป๊ฒŒ ๋“  ๊ฐ€์งˆ ์ˆ˜์žˆ๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค

type A
  c
end

Base.getfield(a::A, ::Field{:b}) = 3

a = A(1)

a.c # This still calls the field access
a.b # This calls the function

์˜ˆ, ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ชจ๋“  ๊ฐœ์ฒด๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€๋Š” ๋ชจ๋“  ํ•„๋“œ๋ฅผ ๊ฐ€๋กœ ์ฑ„๊ธฐ ์œ„ํ•ด getfield(a::A, ::Field) ๋ฅผ ์ •์˜ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

์ข‹์•„, ์ด์ œ ์•Œ์•˜์–ด. ๋ชจ๋“  ๋™์  ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” getfield(a::A, ::Field) ๋ฅผ ์›ํ•˜๋ฏ€๋กœ ๋‚ด๋ถ€ ํ•„๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์„ฑ๊ฐ€์‹  ์‹ค์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ฐพ์ง€ ์•Š๋Š” ํ•œ Core.getfield ์ด๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์•„๋งˆ๋„ ์ฃผ์–ด์ง„ ๊ฒƒ์ด์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ setfield! ์žฌ์ •์˜๋ฅผ ํ—ˆ์šฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ–‰์ด ์œ ํ˜•์ด๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ฐ€๋ณ€ ๋ทฐ๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์ •๋ง ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค.

๋„ค, ์ œ ์ธ์ƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ข‹์•„, IMHO๋Š” ์‹ค์ œ ํ•„๋“œ ์•ก์„ธ์Šค์— .. ๋ฅผ ์‚ฌ์šฉํ• ์ง€ ์•„๋‹ˆ๋ฉด Core.getfield ๋ฅผ ์‚ฌ์šฉํ• ์ง€ ๊ทธ๋‹ค์ง€ ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ๊ธฐ๋Šฅ์„ ์‹คํ—˜์ ์œผ๋กœ ๋„์ž…ํ•˜์—ฌ ๋ณ€๊ฒฝ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ์ด๊ฒƒ์ด 0.4์˜ ์‹œ๊ฐ„ ํ”„๋ ˆ์ž„์— ๋งž๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ตœ์ข… ๊ตฌํ˜„๊ณผ ๋ชจ๋“ˆ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ๋Š” # 5848?

@johnmyleswhite : ๋‚˜๋Š” ๋˜ํ•œ ์ด๊ฒƒ์„ ๋Œ€์นญ์œผ๋กœ ๋งŒ๋“ค๊ณ  setfield! ํ—ˆ์šฉํ•˜๋„๋ก ํˆฌํ‘œ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Gtk.jl์—์„œ๋Š” ๋‘˜ ๋‹ค ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ์™€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ ๊ทœ์น™์ด ๋ฌด์—‡์ธ์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ / ํ•„๋“œ๋ฅผ ๋™์ ์œผ๋กœ ์กฐํšŒํ•ด์•ผํ•˜๋ฏ€๋กœ Julia ๋ฉ”์„œ๋“œ / ๋ณตํ•ฉ ์œ ํ˜•์ด ๋  ์ˆ˜์—†๋Š” PyCall์˜ ์š”์ ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค (๊ฒฐ๊ณผ ๊ตฌ๋ฌธ์€ Python์— ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค). ๊ทธ๋Ÿฐ๋ฐ ์™œ Gtk.jl์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ? ์ด ์ผ์„ ์‹œ์ž‘ํ•˜๋ฉด foo.bar = x ๋Œ€์‹  setbar!(foo, x) , ๋‹ค์Œ ํ‘œ์ค€ ์ค„๋ฆฌ์•„ ์ฝ”๋“œ๊ฐ€ invitably๋„์ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค : ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋ฌด์—‡์ธ๊ฐ€? ์•„๋งˆ๋„ ๊ทธ๋Ÿด ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ถ„๋ช…ํžˆํ•ฉ์‹œ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”์ƒ (๊ทธ๋ฆฌ๊ณ  ๊ตฌ์ฒด์ ๋„) ์œ ํ˜•์— ๋Œ€ํ•ด ์ •์˜ ๋œ ์†์„ฑ getter ๋ฐ setter๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ / ๊ถŒ์žฅ๋ฉ๋‹ˆ๊นŒ?
๋‹ค๋ฅธ ์œ ํ˜•์˜ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์†์„ฑ์„ ๊ฐ€์ ธ ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„ ์ถฉ๋Œ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ  : https://github.com/JuliaLang/julia/issues/4345 , https://groups.google.com/forum/#!msg/julia -users / p5-lVNlDC8U / 6PYcvvsg29UJ

@nalimilan : Gtk๋Š” getter / setter๊ฐ€ ์•„๋‹Œ ๋™์  ์†์„ฑ ์‹œ์Šคํ…œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@tknopp ์•„,

์ด ์‹œ์ ์—์„œ (๊ทธ๋ฆฌ๊ณ  ์˜ฌ๋ฐ”๋ฅธ ๊ทœ์น™์„ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์•ฝ๊ฐ„์˜ ์‹คํ—˜์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค) f ๊ฐ€ "์™€ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ๋…๋ฆฝ ์‹คํ–‰ ํ˜• ๊ฐœ๋…์œผ๋กœ ์ดํ•ด ๋  ๋•Œ f(x) ๊ฐ€ ๋” ์ข‹์Šต๋‹ˆ๋‹ค. f ๊ฐ€ x ์™€ ์‹ค์ œ๋กœ ๋…๋ฆฝ์ ์ด์ง€ ์•Š์€ ๊ฒฝ์šฐ x.f ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์ด์ „ ์˜ˆ์ œ๋ฅผ ์—ฌ๊ธฐ์— ๋งž์ถ”๊ธฐ ์œ„ํ•ด, ๋Œ€๋ถ€๋ถ„์˜ ๋ฒกํ„ฐ์™€ ์ปฌ๋ ‰์…˜์—๋Š” ๋‹จ๊ณ„ ๊ฐœ๋…์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์ธ step ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฒ”์œ„๊ฐ€์žˆ์„ ๋•Œ _only_ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์ข…๋ฅ˜์˜. ๋”ฐ๋ผ์„œ x.step ๋ฒ”์œ„๋ฅผ x ๋ฒ”์œ„์˜ ๋‹จ๊ณ„๋กœ ๊ฐ€์ ธ ์˜ค๋Š” ๋ฐฉ๋ฒ•์ด๋˜๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์•ฝ๊ฐ„์˜ ํŒ๋‹จ ํ˜ธ์ถœ์ด์ง€๋งŒ ์ธ์ƒ์€ ๊ทธ๊ฒƒ๋“ค๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

.. ์€ ๋‚˜์—๊ฒŒ ์ง์ ‘ ์ ‘๊ทผ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. foo.bar. ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋์—์žˆ๋Š” ์ถ”๊ฐ€ ์ ์€ ์ง์ ‘ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค.

์œ ๋‹ˆ ์ฝ”๋“œ ๊ธฐํ˜ธ๋ฅผ ์„ ํƒํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ๋งŽ์€ ๊ธฐํ˜ธ๊ฐ€ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

@GlenHertz , ํ•„๋“œ ์•ก์„ธ์Šค๋ฅผ ์—ฐ๊ฒฐํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@simonbyrne , ์ €๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์œ ๋‹ˆ ์ฝ”๋“œ ์‚ฌ์šฉ์„ ํ•„์š”๋กœํ•˜๋Š” ํ•ต์‹ฌ ์–ธ์–ด ๋˜๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์žˆ๋Š” ๊ฒƒ์„ ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์š”ํ•˜๋Š” ๊ฒƒ์€ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ ์ œ ์ƒ๊ฐ์— (๊ทธ๋ฆฌ๊ณ  ์˜ฌ๋ฐ”๋ฅธ ๊ทœ์น™์„ ์•Œ์•„ ๋‚ด๊ธฐ ์œ„ํ•ด ์•ฝ๊ฐ„์˜ ์‹คํ—˜์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค) f (x)๋Š” f๊ฐ€ "๊ธธ์ด"์™€ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ๋…๋ฆฝํ˜• ๊ฐœ๋…์œผ๋กœ ํ•ฉ๋ฆฌ์  ์ผ ๋•Œ ๋” ๋‚ซ์ง€ ๋งŒ xf๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. f๊ฐ€ x์™€ ์‹ค์ œ๋กœ ๋…๋ฆฝ์ ์ด์ง€ ์•Š์„ ๋•Œ.

์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ์ œ ๊ฐœ์ธ์ ์ธ ๊ทœ์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ธ์–ด ์ƒํ˜ธ ์šด์šฉ์„ฑ ๋˜๋Š” "๊ฑฐ์˜ ํ•„๋“œ"๋˜๋Š” "์ฆ๊ฐ• ํ•„๋“œ"์ธ ํ•ญ๋ชฉ์—๋งŒ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ ํ˜•์˜ ๋ชจ๋“  ํ•„๋“œ ๊ฐ’์— ์˜์กดํ•˜๋Š” ์บ์‹œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ•œ ๊ฐ€์ง€ ํฐ ์งˆ๋ฌธ์€ ์œ ํ˜• ์ถ”๋ก ๊ณผ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ ์ž‘์šฉํ•ฉ๋‹ˆ๊นŒ? s ์˜ ๋‹ค๋ฅธ ๊ฐ’์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ํ˜•์‹์˜ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜๋Š” getfield(x::T, s::Symbol) ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋ ค๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. getfield ์ด ๋งˆ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ํ”„๋กœ๊ทธ๋žจ์˜ ์–ด๋Š ์‹œ์ ์—์„œ๋“  ๊ณ ์ • x ๋ฐ s ์— ๋Œ€ํ•ด getfield(x, s) ์˜ ์ถœ๋ ฅ์„ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์œ ํ˜•์„ ์žฌ์ •์˜ ํ•  ์ˆ˜์—†๋Š” ๊ฒƒ๊ณผ ์–ด๋–ป๊ฒŒ ๋งž ๋ฌผ๋ฆฌ๋Š”๊ฐ€?

s ์˜ ๋‹ค๋ฅธ ๊ฐ’์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ํ˜•์‹์˜ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜๋Š” getfield(x::T, s::Symbol) ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋ ค๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๊ณ„ํš์ด ์ด๊ฒƒ์„ getfield{s}(x::T, f::Field{s}) ๋กœ ํ‘œํ˜„ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ s ๋Š” ์ƒ์ง•์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋†“์ณค๋‹ค. ์ €๋ฅผ ๋ฐ”๋กœ ์žก์•„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@nalimilan : ์˜ˆ, ์˜ค๋ฒ„๋กœ๋“œ ๋œ ํ•„๋“œ๋Š” ๋™์  ์†์„ฑ์—๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ์ž„์Šจ์ด์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์žํ•˜๋Š” ๋ฐฉ์‹์ด๊ณ  ์ €๋Š” ์ด๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์‹ค์ œ getter ๋ฐ setter๋Š” ์ž๋™ ์ƒ์„ฑ๋˜์ง€๋งŒ ๋ชจ๋“  get / set ์ด๋ฆ„ ์ง€์ • ์—†์ด๋„ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. GAccessor ๋ชจ๋“ˆ์˜ ๋ผ์ด๋ธŒ (์งง์€ G_ )

๊ตฌ๋ฌธ์—์„œ ์‹ค์ œ ํ•„๋“œ ์•ก์„ธ์Šค์— <- ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
๋žŒ๋‹ค์— ์‚ฌ์šฉ๋˜๋Š” C ++์˜ -> ์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ <- ๋Š” ํ˜„์žฌ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์œ ํ˜•์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ’์„ ์ง์ ‘ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

.. ์ธํ„ฐ๋ฒŒ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ๋ฏธ์‚ฌ์šฉ ์ƒํƒœ๋กœ ๋‚จ๊ฒจ๋‘๊ณ  ์ง€๊ธˆ๊นŒ์ง€ ์ƒ๊ฐํ•  ์ˆ˜์žˆ๋Š” ๋‹ค๋ฅธ ์šฉ๋„๊ฐ€์—†๋Š” ๋ฏธ์‚ฌ์šฉ ํŽ˜์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•„๋“œ ์•ก์„ธ์Šค์— R์˜ ํ• ๋‹น ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

->๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ C / C ++๋ฅผ ์ง์ ‘ ๋ฏธ๋Ÿฌ๋งํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ต๋ช… ๊ธฐ๋Šฅ. ๋‚˜๋Š” ์ต๋ช…์˜ ๊ธฐ๋Šฅ์„๋ณ„๋กœ ์‹ ๊ฒฝ์„ ์“ฐ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๊ตฌ๋ฌธ์ด ์•ฝ๊ฐ„ ๊ฐ„๊ฒฐํ•˜๊ฑฐ๋‚˜ ์ฝ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹  ํ•  ์ˆ˜ ์žˆ์„์ง€๋„ ๋ชฐ๋ผ
๋ญ”๊ฐ€

func (x) x ^ 2 ๋

๋˜๋Š” ๋” ๊ธธ๊ณ  ์ผ๊ด€๋œ

ํ•จ์ˆ˜ (x) x ^ 2 ๋

์•„๋งˆ๋„ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ข‹์€ ๊ตฌ๋ฌธ์„ ์ƒ๊ฐ ํ•ด๋‚ผ ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋์„ ์‚ฌ์šฉํ•˜์—ฌ.

ํ† ๋ก ์„ ๋„ˆ๋ฌด ๋งŽ์ด ๋ณ€๊ฒฝํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ํ™•์‹คํžˆ ์ดํ•ด๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์‹ค์ œ ํ•„๋“œ ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•ด->๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

2015 ๋…„ 1 ์›” 28 ์ผ ์ˆ˜์š”์ผ ์˜ค์ „ 8:49, John Myles White [email protected]
์ผ๋‹ค :

ํ•„๋“œ ์•ก์„ธ์Šค์— R์˜ ํ• ๋‹น ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/JuliaLang/julia/issues/1974#issuecomment -71857083.

@quinnj : func (x) x^2 end ์ด๋ฏธ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ต๋ช… ํ•จ์ˆ˜์— ๋Œ€ํ•ด ๋งค์šฐ ๊ฐ„๊ฒฐํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. map(x->x^2, 1:10)

ํ•„๋“œ ์•ก์„ธ์Šค์— ํŠน๋ณ„ํ•œ ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ( @simonbyrne์ด ์ œ์•ˆํ•œ ์œ ๋‹ˆ ์ฝ”๋“œ ๋ฌธ์ž๋Š” ์˜ต์…˜์œผ๋กœ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค). x -> x^2 ์žƒ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ ์•„์ง ์ง„ํ–‰ ์ค‘์ด๊ฑฐ๋‚˜ ๋…ผ์˜์ค‘์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋„ํŠธ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์ฃผ์„์„ ๋ชจ๋‘ ์ฝ๊ณ  ํฅ๋ฏธ๋กœ ์› ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ƒˆ ์šด์˜์ž ํ† ํฐ์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ? :> ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ๋Œ€์•ˆ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. |> ์™€ ์œ ์‚ฌํ•˜๋ฉฐ ๋” ๋„ค์ดํ‹ฐ๋ธŒ Julia _feel_์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

c = foo.a + foo.b
pyobj:>obj:>process(c)

์—ฌ์ „ํžˆ ์ž‘์„ฑํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค.

pyobj[:obj][:procees](c)

๋˜๋Š” ๋น„๊ต :

someobj :> array |> length 
# vs
length(get_array(someobj)) 

์ €๋Š” Julia๋ฅผ ์ฒ˜์Œ ์ ‘ํ–ˆ์ง€๋งŒ ๋‹ค์ค‘ ํŒŒ๊ฒฌ ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•ด ๋น ๋ฅด๊ฒŒ ๊ฐ์‚ฌ๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๊ณผํ•™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„์œ„ํ•œ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋งŽ์€ ์ž‘์—…์„ ๋” ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. OO ํŒจ๋Ÿฌ๋‹ค์ž„ / ๊ตฌ๋ฌธ์ด Julia์˜ ์Šคํƒ€์ผ ๊ฐœ๋ฐœ์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น ๊นŒ ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค.

๋˜๋Š” ๋ฌธ์ž์—ด ์ธํ„ด ๋ฐ / ๋˜๋Š” ์ธ์šฉ์— ๋Œ€ํ•ด ์žŠ์–ด ๋ฒ„๋ ธ๊ธฐ ๋•Œ๋ฌธ์— :

someobj <: field_name |> length

@elcritch , <: ๋Š” ํ˜„์žฌ Julia์˜ "is subtype of"์—ฐ์‚ฐ์ž๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์œผ๋ฉฐ, :> ๊ฐ€ ๋„์ž…๋˜๋ฉด ์œ ํ˜• ๊ด€๋ จ ํ•ญ๋ชฉ์— ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ธ์Šต ์žฌ์‚ฐ.

instance..member ์ด ๋ฌธ์ œ์ธ ๊ฒฝ์šฐ ๋ช‡ ๊ฐ€์ง€ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆˆ์„ ๊ฐ€๋ฆฌ์„ธ์š”! ์ด๋“ค ๋ชจ๋‘๊ฐ€ ๋” ๋‚˜์  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • instance^.member (๋‹น๊ทผ ๋„ํŠธ)
  • instance~.member (๋ฌผ๊ฒฐํ‘œ)
  • instance:.member (์ฝœ๋ก  ์ )
  • instance*.member (๋ณ„ํ‘œ)
  • instance-.member (๋Œ€์‹œ ์ )
  • [email protected] (at-sign ์ )
  • instance&.member (์•ฐํผ ๋„ํŠธ)
  • instance$.member (๋‹ฌ๋Ÿฌ ๋„ํŠธ)
  • instance<.>member (์šฐ์ฃผ์„  ์ )

๋‚˜๋Š” ์†”์งํžˆ (a) .. ์ถฉ๋ถ„ํžˆ ์ข‹์•„ ๋ณด์ธ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  (b) ์ด๊ฒƒ์ด ์–ธ์–ด์˜ ๋ชจํ˜ธํ•œ ๊ตฌ์„์ด ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฒƒ์ด ๋ฉ‹์ ธ ๋ณด์ด๋Š”์ง€ ์—ฌ๋ถ€๋Š” ์‹ค์ œ๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ instance.member ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•„๋“œ ๋˜๋Š” getfield ๋ฉ”์„œ๋“œ ๋งŒ ์žˆ๊ณ  ๋‘˜ ๋‹ค ๊ฐ€์งˆ ์ˆ˜๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

(์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋ฉค๋ฒ„์™€ ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ .. ์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๋Š” ๋ฐ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. foo.member ๋Œ€ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๊ณ  "real "field foo._member . ์–ด์จŒ๋“  ์ด๊ฒƒ์€ ๋” ๋‚˜์€ ์Šคํƒ€์ผ์ž…๋‹ˆ๋‹ค. ์ฆ‰, type ์ •์˜๋ฅผ ์ฝ์„ ๋•Œ _member ๊ฐ€ ๋ฌด์–ธ๊ฐ€๊ฐ€ ์•„๋‹ˆ์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด ์ฆ‰์‹œ ๋ถ„๋ช…ํ•ด์ง‘๋‹ˆ๋‹ค. ์ง์ ‘ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ์•ก์„ธ์Šคํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ท€์ค‘ํ•œ ๊ตฌ๋‘์  ๋ถ€๋™์‚ฐ์„ ์ฐจ์ง€ํ•˜์ง€ ์•Š๊ณ  :. ์™€ ๊ฐ™์ด๋ณด๊ธฐ ํ‰ํ•˜๊ณ  ๋ชจํ˜ธํ•œ ๊ฒƒ์œผ๋กœ .. ๋ฅผ) ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.)

.. ๋ฅผ ์ค‘์œ„ ๊ฐ„๊ฒฉ ์—ฐ์‚ฐ์ž๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋†“์น  ์ˆ˜ ์žˆ์ง€๋งŒ ์˜ค๋ฒ„๋กœ๋“œ ๊ฐ€๋Šฅํ•œ ํ•„๋“œ ์•ก์„ธ์Šค๋Š” ๊ฐ€์น˜์žˆ๋Š” ์ ˆ์ถฉ์•ˆ์ž…๋‹ˆ๋‹ค. ์ฝœ๋ก ์— ๋” ์ด์ƒ ์˜๋ฏธ๋ฅผ ์ถ”๊ฐ€ ํ•˜๋Š” ๊ฒƒ์„ ์•ฝ๊ฐ„ ๋‘๋ ค์›Œ :. ์€ ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

:. ๋Š” ํ˜„์žฌ symbol(".") ๋Œ€ํ•ด ์‹ค์ œ๋กœ ์œ ํšจํ•œ ๊ตฌ๋ฌธ์ด๋ฏ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .. ๊ฐ€ ์ž ์žฌ์ ์œผ๋กœ ์œ ์šฉํ•˜๋‹ค๋Š” ์ ์€ ์ž˜ ๋ฐ›์•„ ๋“ค์—ฌ์กŒ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์•„๋ฌด๋„ ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ตฌ๋ฌธ์— ๋‚ญ๋น„ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. @. ์™€ ๊ฐ™์€ ๋” ์ถ”์•…ํ•œ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์™„๋ฒฝํ•˜๊ฒŒ ๊ธฐ์ฉ๋‹ˆ๋‹ค ( . ๋Š” ์œ ํšจํ•œ ๋งคํฌ๋กœ ์ด๋ฆ„์ด ์•„๋‹ˆ๊ณ  ์‹๋ณ„์ž๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ๊ฒƒ๊ณผ๋„ ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค ). ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ด๊ฒƒ์€ Julia์˜ ๋ชจํ˜ธํ•œ ์ฝ”๋„ˆ๊ฐ€ ๋  ๊ฒƒ์ด๋ฏ€๋กœ ๊ทธ๊ฒƒ์„ ์˜ˆ์˜๊ฒŒ ๋งŒ๋“ค ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

.. ์‚ฌ์šฉํ•˜์—ฌ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ž ์žฌ์  ์ถ”์•…ํ•จ์„ ๋ฌด์‹œํ•˜๋Š” ๋ฐ +1

๊ทธ๋ž˜, ์–ด์จŒ๋“  .. ๋กœ ๊ฐ€์ž. .. ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด _range_ ์ƒ์„ฑ์ž๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ด๋ฏธ ์ฝœ๋ก ์ด ์žˆ์Šต๋‹ˆ๋‹ค. start:stop

๋งˆ์ง€๋ง‰ ํŽ€ํŠธ : .: ? ab, a. (b), a. (: b) _and_ a.:b๊ฐ€ ๋„ˆ๋ฌด ๋ฏธ๋ฌ˜ํ•œ๊ฐ€์š”?

@hayd , ๋„ˆ๋ฌด ๋ฏธ๋ฌ˜ํ•˜๊ณ  ์šฐ์—ฐํžˆ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@ihnorton , # 5848 ๋ฒ„์ „์„ ๋ถ€ํ™œ์‹œํ‚ฌ ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ตฌ๋ฌธ ์งˆ๋ฌธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ  Core.getfield(x, Field{y}) ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ "์‹ค์ œ"ํ•„๋“œ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Core.getfield ๊ตฌ๋ฌธ์„ ์ œ์ณ๋‘๊ณ , ์‹ค์งˆ์ ์ธ ์งˆ๋ฌธ์ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๊นŒ?

# 5848์—์„œ @tknopp ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์˜ค๋ฒ„๋กœ๋“œ ๊ฐ€๋Šฅํ•ด์•ผํ•œ๋‹ค๋Š” @JeffBezanson ์˜ ์ œ์•ˆ๊ณผ๋Š” ๋‹ฌ๋ฆฌ "์‹ค์ œ"ํ•„๋“œ ์•ก์„ธ์Šค๋ฅผ ์˜ค๋ฒ„๋กœ๋“œ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ๋งŒ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” ์‹ค์ œ ํ•„๋“œ๋ฅผ ์˜ค๋ฒ„๋กœ๋“œํ•˜๋Š” ๊ฒƒ์„ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋งŒ์กฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹จ, ์–ธ์–ด์˜ ๋™์  ํŠน์„ฑ์œผ๋กœ ์ธํ•ด ๊ตฌํ˜„์ด ํ›จ์”ฌ ๋” ๋ณต์žกํ•ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์ด์žˆ๋Š” ๊ฒฝ์šฐ "๋ชจ๋“ -overloadable"์ ‘๊ทผ ๋ฐฉ์‹ ์˜ˆ๋ฅผ ๋“ค์–ด, x::Vector{Any} , ๋‹ค์Œ ์ผ์„ x[i].y ํ•ด์„ ๋  ์ˆ˜ getfield(x[i], Field{:y}) ๋ฐ ํŒŒ๊ฒฌ ์‹œ์Šคํ…œ์— ๊ด€๊ณ„์—†์ด ์—ฌ๋ถ€์˜ ์˜ณ์€ ์ผ์„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค y ์€ ์‹ค์ œ ํ•„๋“œ์ด์ง€๋งŒ "๊ฐ€์ƒ"ํ•„๋“œ์— ๋Œ€ํ•ด getfield ๋งŒ ํ˜ธ์ถœํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๋Š” x[i] ์˜ ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•ด ๋””์ŠคํŒจ์น˜ ์‹œ์Šคํ…œ์˜ ๋ฏธ๋‹ˆ์–ด์ฒ˜ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ๊ตฌํ˜„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ์€ Module.foo ์ด ์˜ค๋ฒ„๋กœ๋“œ ๊ฐ€๋Šฅํ•ด์•ผํ•˜๋Š”์ง€ ์—ฌ๋ถ€ getfield ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ผ์ •ํ•œ ์ผ๊ด€์„ฑ์ด ์žˆ์œผ๋ฉฐ, ์œ„์—์„œ ์–ธ๊ธ‰ ํ•œ Vector{Any} ์˜ˆ์ œ์—๋Š” Module ๋ฐฐ์—ด ๋ฉค๋ฒ„๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ์ด ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์–ด์จŒ๋“ . ๋ฐ˜๋ฉด์— @JeffBezanson ์€ ์ด๊ฒƒ์ด ์ปดํŒŒ์ผ์„ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ณ  function Base.sum(...) ์™€ ๊ฐ™์€ ์„ ์–ธ์˜ ๋™์ž‘์„ ๊ทธ๋ฃจ ํ‚น ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ง€์ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ๊ฒƒ์€ ์ ์–ด๋„ ์ง€๊ธˆ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ Module (์ฆ‰, Vector{Any} ์•„๋‹˜)๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ ์žˆ๋Š” ๊ฒฝ์šฐ์— Module.foo ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ; ๋ณ€๊ฒฝ๋˜๋Š” ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋ณด์ˆ˜์ ์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•ฝ๊ฐ„์˜ ๋ถˆ์ผ์น˜๊ฐ€ ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Module.foo ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด +1ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ OO ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๊ตฌ๋ฌธ์ด ์‹ค์ œ๋กœ FP๋ณด๋‹ค ์šฐ์ˆ˜ํ•œ ๊ณผํ•™ ์ปดํ“จํŒ… ์˜์—ญ ์ค‘ ํ•˜๋‚˜๋Š” ์—์ด์ „ํŠธ ๊ธฐ๋ฐ˜ ๋ชจ๋ธ๋ง์ž…๋‹ˆ๋‹ค. ์—์ด์ „ํŠธ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์„ค์ •ํ•˜๊ธฐ์œ„ํ•œ ๊ตฌ์ฒด์ ์ด๊ณ  ๋‹ค์ค‘ ์ƒ์†์ด ๊ทธ๋ฆฌ์›Œ์กŒ์ง€๋งŒ Julia์˜ ๊ฐ€๋ณ๊ณ  ๋น ๋ฅธ ์ถ”์ƒํ™”์™€ ๋น ๋ฅธ ํ”„๋กœํ†  ํƒ€์ดํ•‘์€ ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ๋ช‡ ๊ฐœ์˜ ABM ํ”„๋ ˆ์ž„ ์›Œํฌ๊ฐ€ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

ABM์—์„œ๋Š” ์—์ด์ „ํŠธ ์ƒํ˜ธ ์ž‘์šฉ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ์  ํ‘œ๊ธฐ๋ฒ•์ด ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค : Agent1.dosomething (Agent2) ๋Œ€ dosomething (Agent1, Agent2).

์ด ๋ช…๋ฐฑํ•œ ๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์•„๋‹ˆ์ง€๋งŒ ABM์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์ฝ”๋”ฉ ํ•  ๋•Œ์ด ๊ตฌ๋ฌธ ์„คํƒ•์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Julia์—์„œ์ด ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ฐ™์ด
๋””์ž์ธ์—์„œ ๊ธฐ๋Šฅ ์ง€ํ–ฅ์  ์ ‘๊ทผ ๋ฐฉ์‹์— ๊ฐ์‚ฌํ•˜๋Š”๋งŒํผ
๊ด€์ , ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๊ตฌ๋ฌธ์€ ๋งค์šฐ ์œ ์šฉํ•˜๊ณ  ์—ฌ๋Ÿฌ
๋„๋ฉ”์ธ. Ab (C)๊ฐ€ b (A, C)์™€ ๊ฐ™์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
2015 ๋…„ 4 ์›” 22 ์ผ ์˜ค์ „ 8์‹œ 50 ๋ถ„์— "datnamer" [email protected]์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— OO ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด์žˆ๋Š” ๊ณผํ•™ ์ปดํ“จํŒ…์˜ ํ•œ ์˜์—ญ์€
๊ตฌ๋ฌธ์€ ์‹ค์ œ๋กœ FP๋ณด๋‹ค ์šฐ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. ์—์ด์ „ํŠธ ๊ธฐ๋ฐ˜ ๋ชจ๋ธ๋ง์ž…๋‹ˆ๋‹ค. ๋น„๋ก ๋‚ด๊ฐ€
์—์ด์ „ํŠธ ๊ณ„์ธต์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์ฒด์ ์ด๊ณ  ๋‹ค์ค‘ ์ƒ์†์„ ๋†“์น˜๋ฉด
Julia์˜ ๊ฐ€๋ณ๊ณ  ๋น ๋ฅธ ์ถ”์ƒํ™”์™€ ๋น ๋ฅธ ํ”„๋กœํ†  ํƒ€์ดํ•‘์€
๋†€๋ผ์šด-์ด๋ฏธ ๋‘ ๊ฐœ์˜ ABM ํ”„๋ ˆ์ž„ ์›Œํฌ๊ฐ€ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

ABM์—์„œ๋Š” ์—์ด์ „ํŠธ ์ƒํ˜ธ ์ž‘์šฉ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ์  ํ‘œ๊ธฐ๋ฒ•์ด ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค.
Agent1.dosomething (Agent2) ๋Œ€ dosomething (Agent1, Agent2).

์ด๊ฒƒ์€ ๊ฐ€์žฅ ํฐ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ด๊ฒƒ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ABM์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์ฝ”๋”ฉํ•˜๊ธฐ์œ„ํ•œ ํ†ต์‚ฌ๋ก  ์  ์„คํƒ•.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/JuliaLang/julia/issues/1974#issuecomment -95218555.

ABM์—์„œ๋Š” ์—์ด์ „ํŠธ ์ƒํ˜ธ ์ž‘์šฉ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ์  ํ‘œ๊ธฐ๋ฒ•์ด ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค : Agent1.dosomething (Agent2) ๋Œ€ dosomething (Agent1, Agent2).

๊ทธ๊ฒŒ ๋” ๋‚˜์€ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ํŽธ์ง‘ :์ด ABM ์ปจํ…์ŠคํŠธ์—์„œ ๊ตฌ์ฒด์ ์œผ๋กœ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ฒ ์ž๋ฒ•์— ๋Œ€ํ•œ ์ข…๊ต์  ์ „์Ÿ์— ๋น ์ ธ๋“ค์ง€ ๋ง์•„์ฃผ์„ธ์š”. @ dbeach24 , ์•„๋ฌด๋„ ์ค„๋ฆฌ์•„์—์„œ a.b(c) ์ด b(a,c) ์™€ ๋™๋“ฑํ•˜๋‹ค๊ณ  ์ œ์•ˆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ผ์–ด๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ค๋ฒ„๋กœ๋“œ ๊ฐ€๋Šฅํ•œ ์ ์€ ๋‹ค๋ฅธ ์–ธ์–ด์™€์˜ ์ž์—ฐ์Šค๋Ÿฌ์šด ์ƒํ˜ธ ์šด์šฉ์„ ์œ„ํ•ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์ถฉ๋ถ„ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

Subject.Verb (DirectObject)

์—ฌ๋Ÿฌ ์ƒํ™ฉ์—์„œ ์ƒ๋‹นํžˆ ์ž์—ฐ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ OO ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€
ํ•จ์ˆ˜ (A, B)์˜ ๋‹จ์ˆœํ•œ ์žฌ์ •๋ ฌ์ด์ง€๋งŒ, ๊ทธ ์žฌ์ •๋ ฌ์€
๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ๋งŽ์€ ์ผ์„ํ•ฉ๋‹ˆ๋‹ค, IMO.
2015 ๋…„ 4 ์›” 22 ์ผ ์˜ค์ „ 10:32์— "Andy Hayden" [email protected]์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

ABM์—์„œ๋Š” ์—์ด์ „ํŠธ ์ƒํ˜ธ ์ž‘์šฉ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ์  ํ‘œ๊ธฐ๋ฒ•์ด ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค.
Agent1.dosomething (Agent2) ๋Œ€ dosomething (Agent1, Agent2).

๊ทธ๊ฒŒ ๋” ๋‚˜์€ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/JuliaLang/julia/issues/1974#issuecomment -95256390.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ œ์•ˆํ–ˆ๋‹ค. (์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ „์Ÿ์„ ์‹œ์ž‘ํ•  ์ƒ๊ฐ๋„ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ ์ œ์•ˆ์€ ์ธ๊ธฐ๊ฐ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.) ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ „์— ๋‚˜์˜จ ๊ฒƒ์„ ๋ณธ ์ ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
ํฌ๋Ÿผ์—์„œ ์ด๋ฏธ ํ•ด๊ณ ๋˜์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊นจ๋‹ซ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‚˜์œ ์ƒ๊ฐ. ์ด์œ ๋ฅผ ๋ฌผ์–ด๋ด๋„ ๋ ๊นŒ์š”? (์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?)

๊ฐ์‚ฌ.
2015 ๋…„ 4 ์›” 22 ์ผ ์˜ค์ „ 11:09, "Steven G. Johnson" [email protected]
์ผ๋‹ค :

์ฒ ์ž๋ฒ•์— ๋Œ€ํ•œ ์ข…๊ต์  ์ „์Ÿ์— ๋น ์ ธ๋“ค์ง€ ๋ง์•„์ฃผ์„ธ์š”. ๋ฟก๋ฟก
https://github.com/dbeach24 , ์•„๋ฌด๋„ ab (c)๊ฐ€
์ค„๋ฆฌ์•„์—์„œ b (a, c)์™€ ๋™๋“ฑ ํ•จ; ๊ทธ๊ฒƒ์€ ์ผ์–ด๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ค๋ฒ„๋กœ๋“œ ๊ฐ€๋Šฅํ•œ ๋„ํŠธ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์™€์˜ ์›ํ™œํ•œ ์ƒํ˜ธ ์šด์šฉ์„ ์œ„ํ•ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๊ฒŒ ์ถฉ๋ถ„ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

โ€”
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/JuliaLang/julia/issues/1974#issuecomment -95266671.

์ด๋ ‡๊ฒŒํ•˜์ง€ ์•Š๋Š” ํ•œ ๊ฐ€์ง€ ์ด์œ ๋Š” a.b ์€ b ์˜ ๋ฒ”์œ„์—์„œ a ์ฐพ๋Š” ๋ฐ˜๋ฉด b ๋Š” b ์—์„œ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‘˜๋Ÿฌ์‹ธ๋Š” ๋ฒ”์œ„. ์ ์„  ์•ก์„ธ์Šค๊ฐ€ ๋•Œ๋•Œ๋กœ ์™ผ์ชฝ ๊ฐœ์ฒด์—์„œ ์กฐํšŒ๋˜์ง€ ์•Š์œผ๋ฉด ๋งค์šฐ ํ˜ผ๋ž€ ์Šค๋Ÿฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Btw, Julia์˜ ๊ธฐ๋Šฅ์ด ๊ฐ์ฒด ๋‚ด๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ ํ˜„์žฌ ๋ฒ”์œ„์—์„œ ์กฐํšŒ๋˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ๋ฌผ ๋‚ด๋ถ€๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•  ๊ฒƒ์ด๋ผ๋Š” ๋‘๋ ค์›€์ด ์  ๊ณผ๋ถ€ํ•˜๋ฅผ ๋ง‰์•„ ์˜จ ์ด์œ  ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@toivoh , ๋„ํŠธ ์˜ค๋ฒ„๋กœ๋”ฉ์˜ ๋ชจ๋“  ๊ตฌํ˜„์€ ๊ธฐ์กด ๋ฉ”์„œ๋“œ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ฒ”์œ„ ์ง€์ • ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. @ dbeach24 , a.b(c) ๋ฌด์ฐจ๋ณ„ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋ณธ ์ด์œ ๋Š” ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ์œ„ํ•œ ๊ตฌ๋ฌธ์ด ๋„ˆ๋ฌด ๋งŽ์œผ๋ฉด ์–ธ์–ด์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—‰๋ง์ด๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ฒ ์ž๋ฅผ ๊ณ ๋ฅด๋Š” ๊ฒƒ์ด ๋” ๋‚ซ์Šต๋‹ˆ๋‹ค. Julia์˜ ์—ฌ๋Ÿฌ ๋””์ŠคํŒจ์น˜๋Š” b(a,c) ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. b ๊ฐ€ a "์†Œ์œ "๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด ๋” ๋ถ„๋ช…ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค โ€” b(a,c) ๋ฉ”์„œ๋“œ๋Š” _both_ a ๋ฐ c ์˜ํ•ด ๋™์ผํ•˜๊ฒŒ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๊ฐ€์žฅ ํฐ ์˜ˆ์™ธ๋Š” Python ๋˜๋Š” C ++์™€ ๊ฐ™์€ ์–ธ์–ด๋กœ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ํ˜ธ์ถœํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋„ํŠธ ๊ตฌ๋ฌธ์„ ๋ฏธ๋Ÿฌ๋ง ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ๋žŒ๋“ค์€ ๋ฌธ์„œ์™€ ์˜ˆ์ œ๋ฅผ ๋งŽ์ด ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  Julia๋กœ ์ง์ ‘ ๋ฒˆ์—ญ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

๋‚˜๋Š” ๋ชจ๋‘ ์ –์–ด ์žˆ์ง€๋งŒ ab (arg)๋Š” a์˜ ํ•„๋“œ b์— ์ €์žฅ๋œ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์ทจํ•œ ๋‹ค์Œ ์ฃผ์–ด์ง„ ์ธ์ˆ˜๋กœ ํ‰๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋‚ด iPhone์—์„œ ๋ณด๋ƒ„

2015 ๋…„ 4 ์›” 22 ์ผ ์˜คํ›„ 5์‹œ 6 ๋ถ„์— Steven G. Johnson [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์™ธ๋ถ€

@ScottPJones ํ˜„์žฌ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์ข‹์€ ์Šคํƒ€์ผ๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์Šคํƒ€์ผ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š์•˜๊ณ , ์ด๋ฏธ ์˜๋ฏธ๊ฐ€ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— Julia๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹ (์ฆ‰, ํ•„๋“œ์— ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ)๊ณผ ์ผ์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ข‹์€ ์ฃผ์žฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ab (arg)๋ฅผ b (a, arg)์ฒ˜๋Ÿผ ์ทจ๊ธ‰ํ•˜์‹ญ์‹œ์˜ค.
๋‚˜๋Š” _might_ํ•˜์ง€๋งŒ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฉค๋ฒ„๊ฐ€์žˆ๋Š” ๊ตฌ์กฐ์ฒด (์œ ํ˜•)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ Julia๋กœ ์ž‘์„ฑ๋œ ํ•จ์ˆ˜๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋กœ๋“œ ํ•œ ๋‹ค์Œ ๊ตฌ๋ฌธ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ํ•จ์ˆ˜๋ฅผ ๊ฐ์ฒด์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ์ผ์„ํ•˜๊ธฐ์— ๋” ๋‚˜์€โ€œ์ค„๋ฆฌ์•ˆโ€์Šคํƒ€์ผ์€ ๋ฌด์—‡์ผ๊นŒ์š”?

๊ฐ์‚ฌ!

@ScottPJones ๋‚˜๋Š” ์ด๊ฒƒ๋“ค์ด ๋™๋“ฑํ•˜์ง€ ์•Š์•„์•ผํ•œ๋‹ค๋Š” ํ•ฉ์˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค *.

"์Šคํƒ€์ผ"๊ทœ์น™์—๋Š” ์˜ˆ์™ธ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์  ์˜ค๋ฒ„๋กœ๋”ฉ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•„๋“œ์— ํ•จ์ˆ˜๋ฅผ ๋„ฃ์œผ๋ ค๋ฉด ๊ฐ•๋ ฅํ•œ ์‚ฌ๋ก€๊ฐ€ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ์œ„ํ•ด / ๊ทธ๋“ค์ด ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ์–ด๋ฆฌ์„์€ ์ง“์„ํ•˜์ง€ ๋ง์•„์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

๊ทธ๊ฒƒ์€ ์˜ˆ์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค (ํ™•์‹คํžˆ ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ์•„๋‹™๋‹ˆ๋‹ค) ...

99 % ์ด์ƒ์˜ ๊ฒฝ์šฐ typeof (a)์—์„œ ๋””์ŠคํŒจ์น˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ํ•„๋“œ, ๋„ํŠธ ์˜ค๋ฒ„๋กœ๋”ฉ ์—†์Œ.

* _ ๊ทธ๋Ÿฐ๋ฐ์ด ๋•…์— ๋ฐ”๋กœ ๊ทธ๋Ÿฐ ์ผ์„ํ•˜๋Š” ํŒจํ‚ค์ง€๊ฐ€์žˆ์„ ๊ฑฐ๋ผ๋Š” ๊ฑด ๋‹ค๋“ค ์•„์‹ค ๊ฒƒ ๊ฐ™์•„์š” ..._

D์—์„œ๋Š” a.b(arg) ๋Œ€ํ•ด "uniform function call syntax"๋ผ๋Š” ์ด๋ฆ„๋„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๊ฝค ์ธ๊ธฐ๊ฐ€ ์žˆ์ง€๋งŒ, Julia๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋‹ค์ค‘ ๋””์ŠคํŒจ์น˜ ๋ฐฉ์‹ ์ธ ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€๋Š” ์ƒ๋‹นํžˆ ์ผ์น˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ์˜ ํ•จ์ˆ˜๊ฐ€ ์ต๋ช…์ด๊ฑฐ๋‚˜ ์™„์ „ํžˆ ๋• ํ˜•์‹์ด๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ƒ๋‹นํžˆ ์ œํ•œ์ ์ธ IMO์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์˜ ์ „ํ†ต์ ์ธ OO ์–ธ์–ด์˜ ์Šต๊ด€์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ณตํ•ฉ ์œ ํ˜• ์•ˆ์— ํ•จ์ˆ˜ ํ•„๋“œ๋ฅผ ์ €์žฅํ•  ์ด์œ ๊ฐ€๋ณ„๋กœ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋”˜๊ฐ€์—์„œ๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ๋” ์ข‹์€ ์œ„์น˜๋Š” ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ "์‹ค์งˆ์ ์ธ ์งˆ๋ฌธ"๊ณผ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€๋‹ค. ๋˜ํ•œ getfield ์˜ค๋ฒ„๋กœ๋”ฉ์„ ํ—ˆ์šฉํ•˜๊ณ , ๋ชจ๋“ˆ์—์„œ getfield ์˜ค๋ฒ„๋กœ๋”ฉ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, "true getfield"์— ๋Œ€ํ•œ ํŠน์ˆ˜ ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ๊ฑฑ์ •ํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ๋ณด์ˆ˜์  ์ธ ํƒœ๋„๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

@stevengj : ์˜ˆ, ์ œ๊ฐ€ a.b(c) ๊ฐ€ b(a, c) ์™€ ๊ฐ™๊ฒŒ๋˜๋Š” ์ผ์ด ๊ฒฐ์ฝ” ์ผ์–ด๋‚˜์ง€ ์•Š์„ ๊ทผ๋ณธ์ ์ธ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. .

์ด๊ฒƒ์— ๋Œ€ํ•œ ๋ฉ”์ผ ๋ง๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•œ ํ† ๋ก ์ด์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ด€์ ์—์„œ์ด ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ๊ฐ€์žฅ ๊ด€๋ จ์„ฑ์ด ๋†’์€ ๊ฒŒ์‹œ๋ฌผ (@nalimilan)์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://groups.google.com/d/msg/julia-users/yC-sw9ykZwM/-607E_FPtl0J

์ด ๊ธฐ๋Šฅ์„ ์–ธ์ œ ์‚ฌ์šฉ ํ•ด์•ผํ•˜๋Š”์ง€ ์— ๋Œ€ํ•œ ๊ฐœ์ธ ์ •์ฑ…์— ๋Œ€ํ•œ ์˜๊ฒฌ ์— ์ถ”๊ฐ€ํ•˜๋ฉด ์ผ๋ถ€ HTTP ์•„์ด๋””์–ด๊ฐ€ ์—ฌ๊ธฐ์—์„œ ์œ ์šฉ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ getfield() ์—๋Š” ๋ถ€์ž‘์šฉ ๋ฐ setfield!() ๊ฐ€ ์—†์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฉฑ๋“ฑ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค (์ฆ‰, ๋™์ผํ•œ ๊ฐ’์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•˜๋ฉด ํ•œ ๋ฒˆ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ํšจ๊ณผ๊ฐ€ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค). ๋ฐ˜๋“œ์‹œ ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ๊ฐ•์ œ๋˜๋Š” ์—„๊ฒฉํ•˜๊ณ  ๋น ๋ฅธ ๊ทœ์น™์€ ์•„๋‹ˆ์ง€๋งŒ ๋„ˆ๋ฌด ๋ฏธ์น˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ์œ„ํ•œ ์‚ฌ์šฉ ์ง€์นจ์ž…๋‹ˆ๋‹ค.

ํฌ์ธํ„ฐ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€์žˆ๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ฒŒ์‹œํ•˜๊ณ  ํ•„๋“œ๋ฅผ ์„ค์ •ํ•  ๋•Œ ์‚ฌ์šฉ์ž ์ง€์ • setter๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
๊ฒŒ์‹œ๋ฌผ : https://groups.google.com/forum/#!topic/julia -users / _I0VosEGa8o
์ฝ”๋“œ : https://github.com/barche/CppWrapper/blob/master/test/property.jl

setfield๊นŒ์ง€์ด ๋ฐฉ๋ฒ•์„ ํŒจํ‚ค์ง€์—์„œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค! ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ํŒŒ๋ผ ๋ฉ”ํŠธ๋ฆญ ์œ ํ˜• ์‹œ์Šคํ…œ์— ๋„ˆ๋ฌด ๋งŽ์€ ์ŠคํŠธ๋ ˆ์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

getfield / setfield! ์˜ค๋ฒ„๋กœ๋”ฉ์˜ ์ถ”๊ฐ€ ์ด์  ํ•˜๋‚˜๋ฅผ ์–ธ๊ธ‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ ์ ˆํ•œ ์žฅ์†Œ๊ฐ€๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. (https://groups.google.com/forum/#!topic/julia-users/ThQyCUgWb_Q์— ๊ด€๋ จ ์ฃผ์ œ๊ฐ€ ์˜ฌ๋ผ์˜ด)

getfield / setfield๊ฐ€์žˆ๋Š” Julia! ์˜ค๋ฒ„๋กœ๋”ฉ์€ _external package_์—์„œ autoreload ๊ธฐ๋Šฅ์˜ ๋†€๋ž๋„๋ก ์šฐ์•„ํ•œ ๊ตฌํ˜„์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. (์ด ๊ธฐ๋Šฅ์„ ์–ป๊ธฐ ์œ„ํ•ด IPython ์ž๋™ ์žฌ๋กœ๋“œ ํ™•์žฅ https://ipython.org/ipython-doc/3/config/extensions/autoreload.html์— ๋„ฃ์–ด์•ผํ•˜๋Š” ๋ชจ๋“  ๋…ธ๋ ฅ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.) ์ž๋™ ์žฌ๋กœ๋“œ์˜ ์•„์ด๋””์–ด๋Š” REPL๋กœ ์ž‘์—…ํ•˜๋Š” ๋™์•ˆ ์™ธ๋ถ€ ๋ชจ๋“ˆ์˜ ํ•จ์ˆ˜ ๋ฐ ์œ ํ˜•์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

TLDR : getfield / setfield! ์˜ค๋ฒ„๋กœ๋”ฉ, ์‚ฌ์ „ ๋ฐ https://github.com/malmaud/Autoreload.jl ๊ณผ ์œ ์‚ฌํ•œ ํŒจํ‚ค์ง€๊ฐ€ ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.


๋ณด๋‹ค ๊ตฌ์ฒด์ ์œผ๋กœ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜๋Š” Autoreload.jl๊ณผ ์œ ์‚ฌํ•œ ํŒจํ‚ค์ง€๋ฅผ ์ƒ์ƒํ•ด๋ณด์‹ญ์‹œ์˜ค.

๋จผ์ € ๋ชจ๋“ˆ M.jl์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

module M
type Foo
  field1::Int64
end
bar(x::Foo) = x.field1 + 1.0
end

REPL์—์„œ ๋‹ค์Œ์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

julia> using Autoreload2
julia> arequire("M")
julia> foo = Foo(42)

๊ทธ๋Ÿฐ ๋‹ค์Œ M.jl์„

module M
type Foo
  field1::Int64
  field2::Float64
end
bar(x::Foo) = x.field1+x.field2

์ด๊ฒƒ์€ ์ž๋™์œผ๋กœ ๋‹ค์‹œ๋กœ๋“œ๋˜๊ณ  ๋‹ค์Œ์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

# type redefinition removed as already done by Autoreload.jl
const field2_dict = Dict{UInt64,Float64}()
setfield!(x::Foo, ::Field{:field2}, value) = field2_dict[object_id(x)] = value
getfield(x::Foo, ::Field{:field2}) = field2_dict[object_id(x)]
<strong i="25">@do_not_inline</strong> bar(x::Foo) = x.field1 + x.field2

๊ทธ๋Ÿฐ ๋‹ค์Œ REPL์—์„œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

julia> foo.field2 = 3.14
julia> println(bar(foo)) # prints 45.14

์„ฑ๋Šฅ์€ Python๋ณด๋‹ค ๋‚˜์˜์ง€ ์•Š์œผ๋ฏ€๋กœ IPython ์ž๋™ ์žฌ๋กœ๋“œ์—์„œ ์›Œํฌ ํ”Œ๋กœ๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ์•„๋ฌด๊ฒƒ๋„ ์žƒ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. REPL์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋ฉด ์ „์ฒด ์„ฑ๋Šฅ์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์ฝ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— a[:field][:field2][:morestuff](b[:random_stuff]) ์“ฐ๊ธฐ์— ์ง€์ณค์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” 0.4์™€ 0.5์—์„œ ์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์ž‘๋™ํ•˜๋Š”์ด ์ž‘์€ ๋งคํฌ๋กœ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/sneusse/DotOverload.jl

TL; DR
ํ‘œํ˜„์‹ a.b -> getMember(a, :b) ์˜ AST๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๋งคํฌ๋กœ

0.6์—์„œ ์ œ๊ฑฐํ•˜๋ฉด ์ด๊ฒƒ์ด ์ข‹์€ ์•„์ด๋””์–ด๋ผ๋Š” ํ•ฉ์˜๊ฐ€์—†๊ณ  ๋„ํŠธ ๊ตฌ๋ฌธ์œผ๋กœ ์ˆ˜ํ–‰ ํ•  ์ž‘์—…์— ๋Œ€ํ•ด ์ƒ์ถฉ๋˜๋Š” ์ œ์•ˆ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@Keno : ์ƒ์ถฉ๋˜๋Š” ์ œ์•ˆ์— ๋Œ€ํ•œ ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@StefanKarpinski ๊ฐ€ ์•„์ง ์ž‘์„ฑํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ ๊ณง Julep์ด ๋‚˜์˜ฌ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

fieldname(object) ๋˜๋Š” get_fieldname(object) ์™€ ๊ฐ™์€ getter ํ•จ์ˆ˜๋ณด๋‹ค object.fieldname ๋” ์ข‹์€ ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. object.fieldname (๋˜๋Š” object$fieldname )๊ฐ€ getpublicfield (๋” ๋‚˜์€ ์ด๋ฆ„ ์ผ ์ˆ˜ ์žˆ์Œ)์— ๋Œ€ํ•œ ํ˜ธ์ถœ์ด๊ณ  object..fieldname ๊ฐ€ ์‹ค์ œ getfield (๋น„๊ณต๊ฐœ)๋Š” ์ข‹์€ ์˜ต์…˜์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ์œ ํ˜•์€ getter ๋Œ€์‹  getpublicfield ๋ฅผ ์ •์˜ํ•ด์•ผํ•˜๋ฉฐ object.fieldname ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ ํ•˜๋ฉด ํ•„๋“œ๊ฐ€ ๋น„๊ณต๊ฐœ๋ผ๋Š” ์˜ค๋ฅ˜ ID๊ฐ€ ์ œ๊ณต๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค (์— ๋Œ€ํ•œ ์ •์˜๊ฐ€์—†๋Š” ๊ฒฝ์šฐ ๋น„๊ณต๊ฐœ๊ฐ€๋ฉ๋‹ˆ๋‹ค. getpublicfield ).

๊ฒฐ์ • ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ๊ธธ๊ฒŒ ๋…ผ์˜๋˜์—ˆ์œผ๋ฉฐ ์ˆ˜ํ–‰ํ•ด์•ผํ• ์ง€ ๋ง์ง€ ์•Š์•„๋„๋ฉ๋‹ˆ๋‹ค. # 5848์„ ์ฝ์„ ๋•Œ @JeffBezanson @StefanKarpinski ์™€ @stevengj๊ฐ€ ์ด๊ฒƒ์„ ์›ํ•˜๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด์ด ๋ฌธ์ œ๋Š” ์žŠํ˜€์ง€์ง€ ์•Š๋„๋ก ์ด์ •ํ‘œ๋ฅผ ์–ป์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‹ซ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๋‚˜๋Š” ์ด๊ฒƒ์ด 1.0 ์ด์ „์— ์ด๋ฃจ์–ด์ ธ์•ผํ•˜๋Š” ๋ณ€ํ™”๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

@JeffBezanson ๊ณผ ๋‚˜๋Š” ์–ด์ œ ์ด๊ฒƒ์„ ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž ์ •์  ๊ฒฐ๋ก  : (i) ์˜ˆ, ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ๊ฐ€์ ธ์•ผํ•ฉ๋‹ˆ๋‹ค; (ii) Module ๋„ํŠธ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ํ—ˆ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค (ํŠน๋ณ„ํžˆ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค). (iii) Core.getfield ๋Œ€ํ•œ ํŠน๋ณ„ํ•œ ๊ตฌ๋ฌธ์„ ์ œ๊ณตํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค (์˜ค๋ฒ„๋กœ๋“œ ๋œ getfield ๊ฐ€ "์‹ค์ œ"ํ•„๋“œ์™€ ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์งˆ ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ›„์ž๋Š” ๋‹ค์Œ์œผ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ‘์ค„).

@stevengj : ํ•ฉ๋ฆฌ์ ์ธ ๊ณ„ํš ๊ฐ™๋„ค์š”. ์ด๊ฒƒ์ด ๋‹จ์ผ ์ธ์ˆ˜๋กœ ์ œํ•œ๋˜๋Š”์ง€ ๋˜๋Š” ๋‹ค์ค‘ ์ธ์ˆ˜ ๋ฒ„์ „ a.fieldname(b) ๋„ ์ง€์›๋˜์–ด์•ผํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ์œ„์˜ ๋…ผ์˜์— ๋Œ€ํ•œ ๊ฒฐ๋ก ์„ ์ด๋Œ์–ด ๋‚ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์—ฌ๊ธฐ์— ์ ์ ˆํ•œ ๋งˆ์ผ์Šคํ†ค ๋ ˆ์ด๋ธ” (1.0?)์„ ๋ถ™์ด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ!

Jeff์™€ ์ €๋Š” ๋‹ค์ค‘ ์ธ์ˆ˜ ์‚ฌ๊ฑด์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด ๋Š๋‚Œ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ์ง€์›ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๊ฐ€์—†๋Š” ๊ฒฝ์šฐ์—์„œ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์–ด์จŒ๋“  ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค (ํ•˜์ง€๋งŒ ๊ฐ™์€ ์ด์œ ๋กœ ์ฆ‰์‹œ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

๋ณ€ํ™˜๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ์บ์ŠคํŒ…ํ•˜๊ณ  ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ :

abstract AbstractAge{T}
abstract AbstractPerson
type PersonAge <: AbstractAge{AbstractPerson} 
    value::Int64
end

Base.convert(t::Type{AbstractAge{AbstractPerson}}, value::Int64) =  begin
  if value < 140 && value > 0
    PersonAge(value) 
  else
     throw(ErrorException("ValueError"))
  end
end

type Person <: AbstractPerson
  age::AbstractAge{AbstractPerson}
end 

a = Person(32)
a.age = 67

์ด๊ฒƒ์— ๋Œ€ํ•œ ์žฌ๋ฏธ์žˆ๋Š” 3 ์ค„ ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

diff --git a/base/boot.jl b/base/boot.jl
index cd3ae8b..a58bb7e 100644
--- a/base/boot.jl
+++ b/base/boot.jl
@@ -266,6 +266,9 @@ Void() = nothing

 (::Type{Tuple{}})() = ()

+struct Field{name} end
+(::Field{f})(x) where {f} = getfield(x, f)
+
 struct VecElement{T}
     value::T
     VecElement{T}(value::T) where {T} = new(value) # disable converting constructor in Core
diff --git a/src/julia-syntax.scm b/src/julia-syntax.scm
index b4cb4b5..59c9762 100644
--- a/src/julia-syntax.scm
+++ b/src/julia-syntax.scm
@@ -1685,7 +1685,7 @@
     (if (and (pair? e) (eq? (car e) '|.|))
         (let ((f (cadr e)) (x (caddr e)))
           (if (or (eq? (car x) 'quote) (eq? (car x) 'inert) (eq? (car x) '$))
-              `(call (core getfield) ,f ,x)
+              `(call (new (call (core apply_type) (core Field) ,x)) ,f)
               (make-fuse f (cdr x))))
         (if (and (pair? e) (eq? (car e) 'call) (dotop? (cadr e)))
             (make-fuse (undotop (cadr e)) (cddr e))

๋‚ด ์ƒ๊ฐ์ด๋‹ค a.b ์‹ค์ œ๋กœ ํ”„๋กœ์ ์…˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค Field{:b}() ๋Œ€์‹  getfield ์ด ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์–ป์„ ๊ทธ๋ž˜์„œ, x->x.a ๋ฌด๋ฃŒ ์ด๋ฏธ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ getfield ๋Š” ํ•ญ์ƒ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ํ•„๋“œ ์•ก์„ธ์Šค๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ๊ตฌํ˜„์€ ์™„์ „ํžˆ ์ž‘๋™ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ๋Š” ์ƒ๋‹นํžˆ ์–ด๋ ต์Šต๋‹ˆ๋‹ค (sysimg + 5 %, ์ •๋ง ์ฆ๊ฑฐ์šด ๋†€๋ผ์›€์ž…๋‹ˆ๋‹ค). ๋”ฐ๋ผ์„œ ์ด๊ฒƒ์€ ๋ช‡ ๊ฐ€์ง€ ์ „๋ฌธํ™” ํœด๋ฆฌ์Šคํ‹ฑ์ด ํ•„์š”ํ•˜๊ณ  ์ดˆ๊ธฐ ์ตœ์ ํ™”๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ๋˜๋ฉด ์‹คํ–‰ ๊ฐ€๋Šฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ ๊ตฌํ˜„์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์— ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์ด ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ codegen์ด ๋ชจ๋“ˆ ์ฐธ์กฐ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๋˜ํ•œ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ํ›จ์”ฌ ๋” ๋น„์‹ธ๊ฒŒ ๋งŒ๋“ค ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (์†๋„์™€ ๋ฉ”๋ชจ๋ฆฌ). ์ด๊ฒƒ์ด sysimg์— ๋‚˜ํƒ€๋‚  ๊ฐ€๋Šฅ์„ฑ์€ ๊ทธ๋ฆฌ ํฌ์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ถ”๋ก  ์ €ํ•˜๊ฐ€ ์—ฌ๊ธฐ์—์„œ sysimg๋ฅผ ๋” ์ž‘๊ฒŒ ๋งŒ๋“ค์—ˆ์–ด์•ผํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ 5 % ๋” ๋‚˜๋น ์ง€๋Š” ๊ฒƒ์€ ์ข‹์€ ์‹œ์ž‘์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

์˜ˆ, jl_resolve_globals ์—์ด๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผํ•˜๋Š” GlobalRefs๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์™ธ์—๋Š” ์ฝ”๋“œ ์ƒ์„ฑ์ด ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ๋„๋ก ์ธ๋ผ์ธ ์ฒ˜๋ฆฌ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ถ”๋ก ์—์„œ ์šฐ๋ฆฌ๋Š” getindex ํŠœํ”Œ๊ณผ ๋น„์Šทํ•œ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŠœํ”Œ getindex์™€ ๋น„์Šทํ•œ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋Š” ๋‚ด์žฅ ๋œ getindex ๋ฉ”์†Œ๋“œ ์„œ๋ช…๊ณผ ๊ต์ฐจํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š๊ธฐ๋ฅผ ํฌ๋งํ•˜๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ์‚ฌ๊ฑด์ด ์—ฌ๊ธฐ์„œ ์–ด๋–ป๊ฒŒ ํŠนํžˆ ์ ์šฉ๋˜๋Š”์ง€ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

::Module ์— ๋Œ€ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์„€๋„ ์ž‰ ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๋งํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@JeffBezanson ๊ทธ ์„ธ ์ค„๋กœ ๋œ ์ง€์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋กœ์ปฌ ๋นŒ๋“œ์— ์ง์ ‘ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ ํ–ˆ์ง€๋งŒ ์ค„๋ฆฌ์•„๊ฐ€ ์ง€๊ธˆ ์ฏค ์ด๋™ ํ•œ ๊ฒƒ ๊ฐ™์•„์„œ ์ž‘๋™ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์ค„๋ฆฌ์•„ 1.0์˜ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์†Œ์›์ด ํ•˜๋‚˜๋งŒ ์žˆ๋‹ค๋ฉด ์ด๊ฒƒ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. Mimi ์™€ Query ์—์„œ ๋‚ด๊ฐ€ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ์˜ค๋žœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ์˜ ๊ฒฝ์šฐ๋Š” ๊ฝค ์ผ๋ฐ˜์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งคํฌ๋กœ์—์„œ ์ƒˆ๋กœ์šด ์œ ํ˜•์„ ์ƒ์„ฑ ํ•  ํ•„์š”๊ฐ€์—†๋Š” NamedTuples ๋ฒ„์ „์„ ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ ๊ณผ ๊ฐ™์€ ํ•„๋“œ ์„ธํŠธ๋กœ NamedTuple ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ƒ์„ฑ ๋œ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ ๋œ ํ•จ์ˆ˜์—์„œ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ง€๊ธˆ๊นŒ์ง€ Query.jl์—์„œ ๊ฐ€์žฅ ํฐ ๊ฑธ๋ฆผ๋Œ ์ธ blackrock / NamedTuples.jl # 4์˜ type-stable ๋ฒ„์ „์„ ์ž‘์„ฑํ•  ์ˆ˜์žˆ๊ฒŒ ํ•ด์ค„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ์ด๊ฒƒ์€ ์ค„๋ฆฌ์•„์˜ ์ „์ฒด ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์Šคํ† ๋ฆฌ์— ๋Œ€ํ•ด ๋งค์šฐ ์œ ์šฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋ž˜ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

function (obj::MyType).plus(n::Int)
       return obj.val + n
end

์™œ ์„ธ์ƒ์—์„œ ๊ทธ ๊ตฌ๋ฌธ์„ ์›ํ•˜์‹ญ๋‹ˆ๊นŒ?

์“ฐ๊ณ  ์‹ถ์€ obj.plus(n) ๋Œ€์‹  obj + n ์‹ฌ๊ฐํ•œ OO ์Šคํ†กํ™€๋ฆ„ ์ฆํ›„๊ตฐ์ด๋‹ค.

์ข‹์•„, ์ฃผ์–ด์ง„ ์˜ˆ๋Š” ์‚ฌ์†Œํ•œ ๊ฒƒ (๊ทธ๋ฆฌ๊ณ  ๋‚˜์œ ๊ฒƒ)์ด์—ˆ์Šต๋‹ˆ๋‹ค.
getfield ์˜ค๋ฒ„๋กœ๋“œ ๋Œ€์‹ ์ด ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์•„์ด๋””์–ด์˜€์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ฃผ๋กœ ๊ธฐ๋Šฅ์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. getfield ์˜ค๋ฒ„๋กœ๋”ฉ์— ๋Œ€ํ•œ ์ถ•์•ฝ ๋œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ›จ์”ฌ ๋œ ์ค‘์š”ํ•ด ๋ณด์ด๋ฉฐ ๋…ผ์Ÿ ํ•  ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ getfield ๋ฐ setfield! getindex ๋ฐ setindex! ์ง์ ‘ ๋ฏธ๋Ÿฌ๋งํ•˜๋ฏ€๋กœ Julia์—์„œ๋Š” ๋‹ค์†Œ ์ž์—ฐ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ, OO ์Šคํƒ€์ผ์„ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ Julia์˜ ๊ด€์šฉ๊ตฌ์— ์ ํ•ฉํ•˜์ง€ ์•Š์œผ๋ฉฐ, OO์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ ์ •์˜ ๊ตฌ๋ฌธ์œผ๋กœ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (ํ•˜์ง€๋งŒ ์ธ์ˆ˜์— ๋Œ€ํ•œ ์œ„์˜ ์˜๊ฒฌ ์ฐธ์กฐ ).

๋‚˜์—๊ฒŒ ์ผ์–ด๋‚œ ํ•œ ๊ฐ€์ง€๋Š” $ ์—ฐ์‚ฐ์ž๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž, ์ด๊ฒƒ์€ ๋ถ„๋ช…ํžˆ $(x, sym::Symbol) = ... ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ด๋ฏธ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๊ฒŒ ๋งŒ๋“ค์ง€ ๋งŒ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋” ๋ฉ‹์ง„ ๊ตฌ๋ฌธ ์žฌ ์ž‘์„ฑ์„ ์ฆ๊ธธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

x$y          => $(x, ::Type{Val{:y}})
x$z(args...) => $(x, ::Type{Val{:z}}, args...)

๋ณธ๊ฒฉ์ ์ธ getfield ์˜ค๋ฒ„๋กœ๋”ฉ์„ํ•˜์ง€ ์•Š๊ณ  ์ด๋ฏธ์ด ๋ฌธ์ œ์—์„œ ์–ธ๊ธ‰ ๋œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ๋ฅผ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์†”์งํžˆ . ์—ฐ์‚ฐ์ž๋Š” Julia์—์„œ ์˜๋ฏธ ์ƒ ํฌํ™” ์ƒํƒœ์ด๋ฏ€๋กœ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์€ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ์—ฌ์ „ํžˆ ์œ ์šฉ ํ• ๋งŒํผ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

@quinnj , ์ด๋ฏธ #

๊ทธ๋Ÿฌ๋‚˜ ํ•„๋“œ ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•ด ์ด๋ฏธ . ์ด (๊ฐ€) ์žˆ์œผ๋ฏ€๋กœ ํ•„๋“œ ์•ก์„ธ์Šค์™€ ์œ ์‚ฌํ•œ ๋‘ ๊ฐœ์˜ ์—ฐ์‚ฐ์ž (ํ•˜๋‚˜๋Š” ์˜ค๋ฒ„๋กœ๋“œ ๊ฐ€๋Šฅํ•˜๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๊ทธ๋ ‡์ง€ ์•Š์€ ์—ฐ์‚ฐ์ž)๊ฐ€์žˆ๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฑฐ์˜ ๋ณดํŽธ์ ์œผ๋กœ . ์‚ฌ์šฉํ•˜๋Š” Python ๋ฐ ๊ธฐํƒ€ OO ์–ธ์–ด์— ๋Œ€ํ•œ ์–ธ์–ด ๊ฐ„ ํ˜ธ์ถœ์—๋Š” ์•ฝ๊ฐ„ ๋ถ€์ž์—ฐ ์Šค๋Ÿฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ๋„์ž…ํ•˜๊ธฐ์œ„ํ•œ ์œ ํšจํ•œ ์ฃผ์žฅ์œผ๋กœ ๋‹ค๋ฅธ ์–ธ์–ด์™€์˜ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ๋ณด์ง€ ์•Š๋Š”๋‹ค. ๋งˆ์น˜ "Python ์ฝ”๋“œ๋Š” ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ด์ฌ ์ธ ์ฒ™ ํ•  ์ˆ˜ ์žˆ์œผ๋ ค๋ฉด ์šฐ๋ฆฌ๋„์ด ์ž‘์—…์„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค."๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” Julia ์ž์ฒด๋ฅผ ๋” ์ข‹๊ฒŒ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๋” ์ผ๊ด€๋˜๊ฒŒ ๋งŒ๋“ค ๋…ผ์Ÿ์„ ์•„์ง ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. Julia๊ฐ€ OOP ์Šคํƒ€์ผ์˜ x.f() ๊ตฌ๋ฌธ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์€ ์ด๋ฏธ ์ž˜ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ์ผ์น˜๋ฅผ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.

@stevengj , ๋‚ด๊ฐ€ ์˜ค๋Š” ๊ณณ์˜ ์ผ๋ถ€๋Š” x.f _isn't_ ํ•„๋“œ ์•ก์„ธ์Šค๋ผ๋Š” ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ํ•„๋“œ ๋ฉค๋ฒ„ f ์ด (๊ฐ€) ์—†์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๋ฌธ์ œ๋Š” getfield ์˜ค๋ฒ„๋กœ๋”ฉ์— ๊ด€ํ•œ ๊ฒƒ์ด๋ฉฐ, x.f ์‹ค์ œ๋กœ ํ•„๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ๋‚ด๋ถ€์—์„œ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ž ์žฌ์  ์ธ ํ˜ผ๋ž€์ด ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ œ์•ˆํ•œ ๊ตฌ๋ฌธ ์žฌ ์ž‘์„ฑ์˜ ์žฅ์ ์€ getfield์™€์˜ ์ถ”๊ฐ€ ํ˜ผ๋™์—†์ด ์–ธ์–ด ์ƒํ˜ธ ์šด์šฉ์„ฑ ์Šคํ† ๋ฆฌ๋ฅผ ์ถฉ์กฑํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ๊ฐ€ . ๊ฐ€ ๊ณผํฌํ™” ๋  ๊ฒƒ์ด๋ผ๊ณ  ์–ธ๊ธ‰ํ–ˆ์„ ๋•Œ ์–ธ๊ธ‰ ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. x$f ์ด (๊ฐ€) ์ •๋ง ํ›จ์”ฌ ๋” ๋ฒˆ๊ฑฐ๋กœ์šธ๊นŒ์š”? ์™œ์ด _has_ ์  ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๋ฌธ์ œ๋Š” getfield ์˜ค๋ฒ„๋กœ๋”ฉ์— ๊ด€ํ•œ ๊ฒƒ์ด๋ฉฐ x.f ์‹ค์ œ๋กœ ํ•„๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ๋‚ด๋ถ€์—์„œ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ž ์žฌ์  ์ธ ํ˜ผ๋ž€์ด ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@JeffBezanson ์˜ ์„ธ ์ค„ ์ œ์•ˆ์— ํ˜ผ๋™์˜ ์—ฌ์ง€๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. a.b ๋Š” ํ•ญ์ƒ ํ”„๋กœ์ ์…˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๋‚ฎ์•„์ง€๊ณ  getfield ํ˜ธ์ถœ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ getfield ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ”„๋กœ์ ์…˜ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๊ธฐ๋ณธ / ๋Œ€์ฒด ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์›ํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ํ”„๋กœ์ ์…˜ ํ•จ์ˆ˜์— ์ž์‹ ์˜ ์œ ํ˜•์— ๋Œ€ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. getfield ํ•ญ์ƒ ํ•ด๋‹น ์ œ์•ˆ์—์„œ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ํ•„๋“œ ์•ก์„ธ์Šค๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ ์‚ฌ์šฉ์ž๋Š” getfield ์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ( "getfield ์˜ค๋ฒ„๋กœ๋“œ"๋ผ๋Š” ์˜๋ฏธ๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค). ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋งค์šฐ ๊นจ๋—ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๊ทธ ์ œ์•ˆ์ด ์•„์ง ํ…Œ์ด๋ธ”์— ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ๋ช…ํ™•ํ•˜์ง€ ์•Š์ง€๋งŒ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. :)

์ €๋Š”์ด ๊ธฐ๋Šฅ์„ ์ •๋ง ๊ฐ–๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค (Scala์—์„œ ํ•ญ์ƒ ์ข‹์•„ํ–ˆ์Šต๋‹ˆ๋‹ค). ํ•„๋“œ์— ์ง์ ‘ ์•ก์„ธ์Šคํ•˜๋Š” IMHO๋Š” Julia์—์„œ ๋งค์šฐ ์ž์—ฐ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค (์˜ˆ : ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด getter ๋ฐ setter๋ฅผ ๋ฐฉ์–ด ์ ์œผ๋กœ ์ •์˜ํ•˜๋Š” Java ๋ฐฉ์‹๊ณผ ๋น„๊ต). ๊ทธ๋Ÿฌ๋‚˜ "๊ฐ€์ƒ"ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฉด ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ๊นจ์ง€ ์•Š๊ณ  ๊ตฌ์กฐ๋ฅผ ๋ฐœ์ „ / ๋ฆฌํŒฉํ„ฐ๋งํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด v2.0์œผ๋กœ ํƒœ๊ทธ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, v1.0์— ๋Œ€ํ•ด ์ด๊ฒƒ์„ ์žฌ๊ณ ํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ํŒจํ‚ค์ง€ / ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๋ฅผ์œ„ํ•œ ํŒจํ‚ค์ง€๋ฅผ ๋นŒ๋“œ ํ•  ๋•Œ ์†์„ฑ ์ ‘๊ทผ์ž๋ฅผ ์˜ค๋ฒ„๋กœ๋“œํ•˜๋ฉด ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ ํ›จ์”ฌ ๋” ๊นจ๋—ํ•œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ฃผ์žฅ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

complex_data_structure.attribute

์ž…๋ ฅํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

get(complex_data_structure, :attribute)

์—ฌ๊ธฐ์„œ get ๋Š” :attribute ์„ค๋ช…๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ ์˜ค๋Š” ๋ฐ ํ•„์š”ํ•œ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

์ด๋Š” ์ž ์žฌ์ ์œผ๋กœ REPL์—์„œ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์–ธ์–ด ์ฝ”๋“œ ๋ฐ ๋ฐ์ดํ„ฐ ํƒ์ƒ‰์— ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, setter ์†์„ฑ ์ธํ„ฐ์…‰ํ„ฐ๋„ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค (ํ˜„์žฌ ๋‚ด ๋งŽ์€ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ด๋ฏธ ๋ฐœ๊ฒฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค :)).

set(complex_data_structure, :attribute, modify_attribute(get(complex_data_structure, :attribute), additional_arguments))

์†์„ฑ getter ๋ฐ setter๊ฐ€ Julia์˜ ์ผ๋ถ€๋กœ ํฌํ•จ ๋œ ๊ฒฝ์šฐ ์œ„์˜ ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

complex_data_structure.attribute = modify_attribute(complex_data_structure.attribute, additional_arguments)

๋‚ด ๊ฒธ์†ํ•œ ์˜๊ฒฌ์œผ๋กœ๋Š” ํ›จ์”ฌ ๋” ์ฝ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. (์ฐธ๊ณ  : ํŒŒ์ดํ”„ ์ปดํฌ์ง€์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋” ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ additional_arguments ๋‹ค์‹œ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋Œ€ํ•œ ์ฃผ์žฅ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์œ ํšจํ•ฉ๋‹ˆ๋‹ค.)

๋˜ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฐ’์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์ด๋ฉฐ v1.0์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํฌ๊ฒŒ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ ํ•  ๋ฐฉ๋ฒ•์ด์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (๋‚ด๊ฐ€ ํ‹€๋ฆฐ ๊ฒฝ์šฐ ๋ˆ„๊ตฐ๊ฐ€ ๋‚˜๋ฅผ ๊ณ ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ)?

module point

mutable struct Point
    x::Int
    y::Int
    function Point(x, y)
        if x < 0 || y < 0
            throw(error("Only non-negative values allowed"))
        end
        this = new(x, y)
    end
end

end
# point

p1 = point.Point(-1, 0)
# Only non-negative values allowed

# Stacktrace:
# [1] point.Point(::Int64, ::Int64) at ./In[30]:8
# [2] include_string(::String, ::String) at ./loading.jl:515

p1 = point.Point(0, 0);
p1.x = -1;
p1
# point.Point(-1, 0)

์ƒ์„ฑ์ž๋Š” ๋„๋ฉ”์ธ ์ž…๋ ฅ์„ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋กœ ์ œํ•œ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‚ฌ์šฉ์ž๋Š” ์—ฌ์ „ํžˆ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฐ’์„ ์ž…๋ ฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†์„ฑ getter ๋ฐ setter๋Š” ์—ฌ๊ธฐ์—์„œ ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ๋” ์ฆ‰๊ฐ์ ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์–ธ์–ด ์‚ฌ์šฉ์ž๋กœ์„œ ํ›จ์”ฌ ๋” ๊นจ๋—ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—์„œ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋˜ํ•œ PyCall.jl ๋ฐ DataFrames.jl๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์— ํฐ ์ด์ ์„ ์ œ๊ณตํ•˜์—ฌ ์‚ฌ์šฉ์ž๋ฅผ์œ„ํ•œ ๋” ๋‚˜์€ ์ง๊ด€์  ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์ถ• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒจํ‚ค์ง€์˜ ์ž‘์„ฑ์ž๋Š” ๋˜ํ•œ์ด ๊ธฐ๋Šฅ์— ๊ด€์‹ฌ์„ ํ‘œ๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ƒ๊ฐ? ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์–ด ๋ณด๋ฉด ์ด๋ฏธ ์ตœ์ข… ๋‹จ๊ณ„์— ๊ฐ€๊นŒ์›Œ์กŒ์Šต๋‹ˆ๋‹ค. ์ €์ž์˜ ์ƒ๊ฐ์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

https://github.com/bramtayl/DotOverloading.jl ์—์„œ ์œ ํ˜• ์•ˆ์ •์ ์ธ ์„ ํƒ์  ๋งคํฌ๋กœ๋กœ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค

@bramtayl , ๋‚˜๋Š” a.b ํ‘œํ˜„์‹ ์•ž์— @overload_dots ๋ฅผ ๋„ฃ์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋งคํฌ๋กœ๋ฅผ๋ฒ ์ด์Šค์— ์ถ”๊ฐ€ ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งคํฌ๋กœ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ „๋žต์„ ํŒŒ์„œ์— ๊ตฌ์šธ ๊ฒƒ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ „์ฒด ํŒŒ์ผ์—์„œ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ IDE๋กœ ํ•ดํ‚น ๋  ์ˆ˜์žˆ๋Š” ๋งคํฌ๋กœ์ž…๋‹ˆ๋‹ค.

์ฆ‰ ์ˆ˜๋ฐ˜ a.b ์œผ๋กœ ํ•ด์„๋˜๊ณ  Expr(:., :a, :(Val{:b}()) ์™€๋กœ ์ €ํ•˜ get_field_overloadable(a, Val{:b}())

@bramtayl , ์œ„ ์˜ Jeff์˜

getfield ์˜ค๋ฒ„๋กœ๋”ฉ์˜ ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์€ ์ผ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ๋‚ด๋ถ€์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ ๋‚ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋‚ด์ผ ๋ณด๊ณ ์„œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์กฐ์˜ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ๋ฟ ์ผ ๋•Œ, ํŠนํžˆ ๋‚ด ์˜์กด์„ฑ์— 3 ๋‹จ๊ณ„ ๊นŠ์ด์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ฝ”๋“œ๋ฅผ ํŽธ์ง‘ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์„ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ฉ๋ฆฌ์ ์ด๊ณ  ๋น ๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ์— ์ง์ ‘ ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ค‘์ธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ œ์–ด ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๋ผ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์š”์ ์€ getfield ๋ฐ setfield๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ฑฐ๋Œ€ํ•œ ํ•จ์ˆ˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋Œ€์‹  ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ์ง์ ‘ ์•ก์„ธ์Šคํ•œ๋‹ค๋Š” ํ•ฉ๋ฆฌ์ ์ธ ๊ธฐ๋Œ€๋ฅผ ์›ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ struct ํ‚ค์›Œ๋“œ๋Š” ์œ ํ˜•์„ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์–ด C๋ฅผ ์ƒ๊ธฐ์‹œ์ผœ ์ฃผ๋ฉฐ getfield ์•ก์„ธ์Šค๊ฐ€ ์ง์ ‘์ ์ด์–ด์•ผํ•œ๋‹ค๋Š” ๊ธฐ๋Œ€๊ฐ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ $ ์—ฐ์‚ฐ์ž๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ getfield ์—์„œ์ฒ˜๋Ÿผ ์ง์ ‘ ์•ก์„ธ์Šค ํ•  ๊ฒƒ์ด๋ผ๋Š” ๊ธฐ๋Œ€๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ•ฉ๋ฆฌ์ ์ธ ํƒ€ํ˜‘์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ๋Š” ํŠน์ˆ˜ ๋ฌธ์ž์ด๋ฏ€๋กœ ๊ทธ๋ฆฌ ๋†€๋ž์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์ด ์ ๊ณ  ๋” ์ด์ƒ ํ•จ์ˆ˜๊ฐ€๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ๊ธฐํ•˜๊ธฐ ์‰ฌ์šฐ ๋ฉฐ R์—์„œ๋„ ๋น„์Šทํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

getfield ์˜ค๋ฒ„๋กœ๋”ฉ์˜ ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์€ ์ผ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ๋‚ด๋ถ€์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์œ„์˜ @JeffBezanson ๊ตฌํ˜„์€ getfield (๋˜๋Š” setfield )๋ฅผ ์˜ค๋ฒ„๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์ด๊ฒƒ์„ 1.0์œผ๋กœ ๋งŒ๋“ค ๊ฒƒ์„ ๊ฐ„์ฒญํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ข…์ข… ๋‚ด ์ฝ”๋“œ๋ฅผ ๋‹ค์†Œ ์œ ์—ฐํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด getter / settings๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ (๊ทธ๋ฆฌ๊ณ  ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ถ๊ธˆํ•ด ํ•จ)๊ณผ ๋‚ด ์ฝ”๋“œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ํ•„๋“œ ์•ก์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก "ํ—ˆ์šฉ / ์žฅ๋ ค"ํ•˜๋Š” ๊ฒƒ ์‚ฌ์ด์—์„œ ๊ฐˆ๋“ฑ์„ ๋Š๋‚€๋‹ค.

๋งŽ์€ ๊ฒŒํ„ฐ์™€ ์„ธํ„ฐ๋ฅผ ๋ฐฉ์–ด ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์ค„๋ฆฌ์•ˆ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ Julia๋Š” ๊ฐœ์ธ / ๋ณดํ˜ธ ํ•„๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ํ•„๋“œ์— ์ง์ ‘ ์•ก์„ธ์Šคํ•˜๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์™€ ๋งŽ์€ ์ถฉ๋Œ์„ ์ผ์œผํ‚ค์ง€ ์•Š๊ณ  ๋งŽ์€ getter / setter ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  getfield ๋ฐ setfield! (๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ)์— ๋Œ€ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€์•ˆ์œผ๋กœ Val{:fieldname} ์ •๋„์— ๋ฐœ์†ก๋˜๋Š” ๊ฒƒ๋„ ์‚ฌ์šฉ์ž ์นœํ™”์  ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ์ง์ ‘ ํ•„๋“œ ์•ก์„ธ์Šค๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๊ตฌ์กฐ์ฒด๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ์ž ๊ทธ๋Š” ๊ฒฝ์šฐ ํŠนํžˆ ์žฅ์ˆ˜ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ ๊ถŒ์žฅ๋˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. @JeffBezanson ์˜ ๊ตฌํ˜„์€์ด ๋”œ๋ ˆ๋งˆ์—์„œ ์•„์ฃผ ๊น”๋”ํ•œ ๋ฐฉ๋ฒ• ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋งž์•„, @davidanthoff. getfield ์˜ค๋ฒ„๋กœ๋”ฉ๊ณผ . ํ•„๋“œ ์•ก์„ธ์Šค ๊ตฌ๋ฌธ์˜ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ํ•ฉ์ณ์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•„๋“œ ์•ก์„ธ์Šค ๊ตฌ๋ฌธ์˜ ๊ณผ๋ถ€ํ•˜๋ฅผ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฏ€๋กœ 1.x ๋ฆด๋ฆฌ์Šค์— ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ 1.0์—์„œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™„์„ฑ ๋œ ๋””์ž์ธ์ด๋‚˜ ๊ตฌํ˜„ํ•  ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค.

(C-) ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์— ๋„ํŠธ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ๊ตฌ๋ฌธ์€ ํฌ์ธํ„ฐ๋ฅผ ์ด๋™ ๋ฐ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ๋งŒ ์ ์„ ์‚ฌ์šฉํ•˜๊ณ  deref๋ฅผ ์œ„ํ•ด []๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ somepair a :: Int b :: Int end, p :: Ptr {somepair}๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด pa๋Š” a ํ•„๋“œ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ์ด๊ณ  pa [] = 3์œผ๋กœ ์“ฐ๊ฑฐ๋‚˜ x =๋กœ ์ฝ์Šต๋‹ˆ๋‹ค. ์•„๋น [].

๋‹ค์Œ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ํƒ€์ž…์˜ ํฌ์›Œ๋“œ ์„ ์–ธ๊ณผ C ํ—ค๋”๋ฅผ ๊ฐ€์ ธ ์˜ค๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด C๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ์Šต๋‹ˆ๋‹ค.

์ถ”์‹ , ๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

function getfield(p::Ptr{T}, fn::Symbol) # dispatch on values of T and fieldname
ftype = fieldtype(T, fn)
offset = fieldoffset(T,fn)
return convert(Ptr{ftype}, p+offset)
end

getindex(p::Ptr{T}) where T = unsafe_load(p)
setindex!(p::Ptr{T}, v) where T = unsafe_store!(p, convert(T,v))

๋ณด๋„ˆ์Šค ํฌ์ธํŠธ์˜ ๊ฒฝ์šฐ julia์˜ ๋Ÿฐํƒ€์ž„ lib์˜ ์œ ํ˜•์„ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ pointer_from_objref๋Š” ์‹ค์ œ๋กœ ๋” ํŽธ๋ฆฌํ•œ ์ธํŠธ๋กœ ์ŠคํŽ™ ์…˜์„ ์œ„ํ•ด ๋ฉ‹์ง„ ์œ ํ˜•์˜ ํฌ์ธํ„ฐ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ผํ•œ ์˜คํ”„์…‹์„ ๊ฐ€์ง„ ๋‘ ๊ฐœ์˜ ํ•„๋“œ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์กฐํ•ฉ์ด ์ž๋™์œผ๋กœ ์ž‘๋™ํ•ด์•ผํ•œ๋‹ค๋Š” ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค.

@chethega ๋‚˜๋Š” ๋‹น์‹ ์ด C์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ ์ฑ„ํƒ์„ ๋‘˜๋Ÿฌ์‹ผ ๋ฌธ์ œ์—†์ด ๋Œ€๋žต ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” https://github.com/JuliaLang/julia/pull/21912๋ฅผ ์ฐพ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (์œ ํ˜• ์‹คํ–‰ ์œ„๋ฐ˜, -๊ทธ ์–ธ์–ด์—์„œ ๊ฐ€๋Šฅํ•œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์ œํ•œํ•˜๋Š” ๊ฒฝ๊ณ„ ์•ก์„ธ์Šค, ๋‚ด๋ถ€ ํฌ์ธํ„ฐ์˜ ์•จ๋ฆฌ์–ด์‹ฑ ๋“ฑ).

์ง€์†์ ์ธ ์ „ํŒŒ๊ฐ€ ์ด๊ฒƒ์„ ๋” ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊นŒ์š”?

์ด์ •ํ‘œ๋ฅผ 1.0์œผ๋กœ ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค! :)

@ Liso77 ๋ฌด์Šจ ๋ง์ด์•ผ? ๋‹ซ์„ ๋•Œ ์ƒํƒœ์— ํ‘œ์‹œ๋œ๋Œ€๋กœ ์ด๋ฏธ git master์— ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

@nalimilan ๋‚ด๊ฐ€ ์ž˜๋ชป ์ดํ•ดํ•˜๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” 1.x๊ฐ€ 1.0 ์ดํ›„์— ํ•ด๊ฒฐ ๋  ์—ฐ๊ธฐ ๋œ ๊ฒƒ๋“ค๋กœ ๋ถ„๋ฅ˜๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ์ด์ œ ํ•ด๊ฒฐ

์˜คํ”ˆ ์†Œ์Šค๋Š” ๋ถ„์‚ฐ ๋œ ์ปค๋ฎค๋‹ˆํ‹ฐ์ž…๋‹ˆ๋‹ค. ์ด์ •ํ‘œ๋Š” 1.0๊นŒ์ง€ ์™„๋ฃŒํ•ด์•ผํ•˜๋Š” ๊ฒƒ์„ ์„ค์ •ํ•˜์ง€๋งŒ ๊ธฐ์—ฌ์ž๋Š” ์›ํ•˜๋Š”๋Œ€๋กœ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ˆ„๊ตฐ๊ฐ€ 1.0์—์„œ ์ด๊ฒƒ์„ ์›ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๊ฑฐ๊ธฐ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

@ Liso77 ๋‚ด๊ฐ€ ์ดํ•ดํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์€ v1.0์—๋Š” ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Julia v1.0 ๊ธฐ๋Šฅ ๋™๊ฒฐ ๋‚ ์งœ๋Š” 12 ์›” 15 ์ผ๋กœ ์„ค์ •๋˜์—ˆ์ง€๋งŒ์ด ๋ฌธ์ œ๋Š” 12 ์›” 17 ์ผ์— ์ข…๋ฃŒ๋˜์—ˆ์œผ๋ฏ€๋กœ 1.x ๋ฆด๋ฆฌ์Šค์—์„œ ์˜ˆ์ƒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ํ•ด์„์ด ์ž˜๋ชป๋œ ๊ฒฝ์šฐ ํ•ต์‹ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‚˜๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ๋งˆ์Šคํ„ฐ์— ๋ณ‘ํ•ฉ๋˜์—ˆ์œผ๋ฉฐ ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์— ํฌํ•จ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

:) ์Œ! 1.0์—์„œ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ 1.0์— ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์›ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฐฉํ•ดํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค! :)

๋‚˜๋Š” NEWS ํŒŒ์ผ์ด 1.0์œผ๋กœ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด์ •ํ‘œ๋Š” "1.x ๋ฆด๋ฆฌ์Šค ์‹œ๋ฆฌ์ฆˆ์—์„œ ํ˜ธํ™˜์„ฑ์„ ๊นจ์ง€ ์•Š๊ณ  ๊ตฌํ˜„ํ•  ์ˆ˜์žˆ๋‹ค"๋Š” ์˜๋ฏธ๋กœ ์ถ”๊ฐ€๋˜์—ˆ์ง€๋งŒ ์ฝ”๋“œ๊ฐ€ ์ค€๋น„ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— 1.0 ๊ธฐ๋Šฅ์ด ๋™๊ฒฐ๋˜๊ธฐ ์ „์— ์–ด์จŒ๋“  ๋ณ‘ํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด ์ด์ •ํ‘œ๋ฅผ ์ œ๊ฑฐํ–ˆ์ง€๋งŒ์ด ์‹œ์ ์—์„œ master์— ๋ณ‘ํ•ฉ ๋œ ๋ชจ๋“  ํ•ญ๋ชฉ์€ 1.0์ด๋ฉ๋‹ˆ๋‹ค.

์„ค๋ช…ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์‹ ๋‚œ๋‹ค! NEWS ํŒŒ์ผ๋„ ํŠนํžˆ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

์ œ๊ฑฐํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! 1.0์— ๋‚˜์˜ฌ ๊ฒƒ์ด ๋„ˆ๋ฌด ๊ธฐ์ฉ๋‹ˆ๋‹ค! :)

์˜ˆ๋ฅผ ๋“ค์–ด fieldnames ? ์˜ค๋ฒ„๋กœ๋“œ๋ฅผ ํ—ˆ์šฉํ•˜์—ฌ ์ž๋™ ์™„์„ฑ์—์„œ ์ด๋Ÿฌํ•œ ์ƒˆ๋กœ์šด "๋™์ ์œผ๋กœ ์ •์˜ ๋œ ํ•„๋“œ"๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งŽ์€ ์—ด ๋ฐ / ๋˜๋Š” ๊ธด ์—ด ์ด๋ฆ„์ด์žˆ๋Š” DataFrame s (์•ž์œผ๋กœ df.column_name ๋ฅผ ์ง€์›ํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •)๋ฅผ ๋‹ค๋ฃฐ ๋•Œ์™€ ๊ฐ™์ด ๋Œ€ํ™”์‹ ์‚ฌ์šฉ์„ ์œ„ํ•ด ๋งค์šฐ ๊ฐ•๋ ฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ˜„์žฌ REPL (ํƒญ ํ™•์žฅ), IJulia ๋“ฑ์ด ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹Œ ์œ ํ˜• ์ •์˜๋ฅผ ๋ด…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€ํ™” ํ˜• ์‚ฌ์šฉ์„ ์œ„ํ•ด ๋ณ€๊ฒฝ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋”ฉ ์ค‘์— ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— Juno์™€ ๊ฐ™์€ IDE์—์„œ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋งˆ๋„ ๋ถˆ๊ฐ€๋Šฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@oschulz , ์ด๋ฏธ fieldnames ์˜ค๋ฒ„๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

julia> struct Foo; foo; end

julia> fieldnames(Foo)
1-element Array{Symbol,1}:
 :foo

julia> Base.fieldnames(::Type{Foo}) = [:bar, :baz]

julia> fieldnames(Foo)
2-element Array{Symbol,1}:
 :bar
 :baz

๊ทธ๋ฆฌ๊ณ  fieldnames ๋Š” REPL์ด ๋ณด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

julia> x = Foo(3)
Foo(3)

julia> x.ba<tab>
bar baz

@yurivish ๋งž์Šต๋‹ˆ๋‹ค-ํ•˜์ง€๋งŒ ํ˜„์žฌ ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๊ฒƒ์ด "์•ˆ์ „"ํ•ฉ๋‹ˆ๊นŒ? fieldnames ์— ์˜์กดํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ complete_fieldnames(x) = fieldnames(x) ๋ฅผ ์ •์˜ํ•˜๊ณ  REPL ์™„์„ฑ์— complete_fieldnames ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ง€์ • ์™„์„ฑ์— ๋Œ€ํ•ด ์˜ค๋ฒ„๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์ด๊ฒƒ์ด ์ œ๊ฐ€ ์ด๊ฒƒ์„ ์ œ๊ธฐ ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค. Base์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณ€๊ฒฝ / ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ REPL๊ณผ ์นœ๊ตฌ๋“ค์ด ๋‚˜์ค‘์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 0.7 ๊ธฐ๋Šฅ ๋™๊ฒฐ ๊ด€์ ์—์„œ ...

์ด๊ฒƒ์ด ์ œ๊ฐ€ getproperty ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. fieldnames ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ช…ํ™•ํžˆํ•˜๋Š” ๋ฐ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค. fieldnames ๋ฐฉํ•ดํ•˜๋ฉด ํ™•์‹คํžˆ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ํšจํ•œ ์†์„ฑ ๊ฐ’์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น propertynames ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก , ๊ทธ๊ฒƒ์€ ์ž˜ ์ •์˜ ๋œ ๊ฐœ๋…์ด ์•„๋‹ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š” ์™„์„ฑ์„ ์œ„ํ•ด ๋” ๊ตฌ์ฒด์ ์ธ ๊ฒƒ์„ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ „๋ฌธ๊ฐ€์˜ ์˜๊ฒฌ๊ณผ ์‹ฌ์ธต ๋ถ„์„์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋Š๋‚Œ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค (๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!).์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์—ด์–ด์•ผํ•ฉ๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰