d2ãåŒã³åºãé¢æ°d1ã®åã«é¢æ°d2ãå®çŸ©ããŠãããd2ãå€æŽãããšãd1ã¯d2ã®å€ãå®çŸ©ã䜿çšããŸãã
ããã¯ãã¹ãŠããªã³ã³ãã€ã«ãããŠããããã ãšæããŸãããããããããã«ã€ããŠã®ã¡ã¢ã®èŠåãããã¯ãã§ããïŒ ãŸãã¯ãå€ãå®çŸ©ãæ°ããå®çŸ©ã®longjmpã«çœ®ãæããããšã¯å¯èœã§ããããïŒ
ïŒç§ã¯åžžã«å
šè² è·ãããããšã¯éããªãã®ã§ãREPLã«ãšã£ãŠæãéèŠã§ãïŒ
julia> function d2()
a
end
julia> function d()
d2()
end
julia> d()
in d: a not defined
julia> function d2()
b=2
end
julia> d()
in d: a not defined
julia> d2
Methods for generic function d2
d2() at prompt:2
julia> function d()
d2()
end
julia> d()
2
ããã¯ãé¢æ°ã®å®çŸ©æã«d2()
ã®ã³ãŒããçæããããã®æç¹ã§d()
ã¡ãœããã解決ãããããã ãšæããŸãã ãæ°ã¥ãã®ãšããã d2()
ã¯å
ã
å®çŸ©ãããŠãããšããã«åå®çŸ©ããŠãæåŸ
ã©ããã«æ©èœãããããšãã§ããŸãã çæ³çã«ã¯ããã®ããã«å€æŽããããšãã«d()
ã«äŸåãããã®ãèªåçã«åå®çŸ©ããŸããããããå¯èœã«ããã¡ã¿ããŒã¿ã¯ãããŸããã ãã®åäœã«ã€ããŠã®èŠåãããã¥ã¢ã«ã«èšèŒã§ãããšæããŸãã ããã§ãä¿®æ£ããæ¹ãè¯ãã§ããããããããè¡ãã®ã¯å°ãé£ãããšæããŸãïŒ-/
誰ãããã«æ°ä»ããªãããšãæãã§ããŸããããããã¯ç§ã«ãšã£ãŠçŸå®çã§ã¯ãªãã£ããšæããŸã:)
ããããã楜ããã§ãã å®è¡ããããŸã§è§£æ±ºãããªããããå®éã«JITãæ©èœããŠããããšã確èªã§ããŸãã
julia> function f2()
a
end
julia> function f1()
f2()
end
julia> function f2()
2
end
julia> f1()
2
ãã ããããã«å¯ŸåŠããæåã®æ¹æ³ã¯ããããŸãããããããREPLã§äºæããªãçµæã«ã€ãªããå¯èœæ§ãããããšãæããŠããŸãã ãšã©ãŒã䜿çšããŠåçãªæ¹æ³ã§éãã瀺ããŸããããå éšæ¹çšåŒãŸãã¯å®æ°ãå€æŽããå Žåã®åœ±é¿ã確èªããããšããå Žåã«ãçºçããå¯èœæ§ããããŸãã
ã¡ãœãããå€æŽããããšãã«æŽæ°ããå¿ èŠãããå¯èœæ§ã®ããå Žæã«ã¯ã次ã®2ã€ã®ã¿ã€ãããããŸãã
åè ã¯ãé¢æ°æ¬äœãå€æŽããã ãã§æŽæ°ã§ããŸãããã®å Žã§å€æŽããããåŒã³åºãå ã®ãµã€ããã¢ã¯ãã£ãã«æŽæ°ããŠæ°ããå ŽæãåŒã³åºãããå€ãé¢æ°æ¬äœãæ°ããããŒãžã§ã³ã«ãžã£ã³ãããã¹ã¿ãã«çœ®ãæããããšãã§ããŸãã ããªãã·ã§ã³ã§åŒã³åºãå ãµã€ãã«ããããé©çšããŸãã ã€ã³ã©ã€ã³åããã«ã¯ãé¢æ°ãã€ã³ã©ã€ã³åããåŒã³åºãå ã远跡ããããããåJITããå¿ èŠããããŸãã
ã¡ãœãããã€ã³ã©ã€ã³åãããŠããªããŠããã¡ãœãããåŒã³åºãé¢æ°ã¯ãã¡ãœãããå€æŽãããå Žåã«å€æŽãããå¯èœæ§ã®ããåã®åäœã«äŸåããå¯èœæ§ããããããå®éã«ã§ããããšã¯ã³ãŒããç Žæ£ããããšã ãã§ãã ããã¯äž»ã«ã€ã³ã¿ã©ã¯ãã£ããªã±ãŒã¹ã®ããã®ãã®ã§ãããããã³ãŒãã®åã³ã³ãã€ã«ã¯å€§ããããšã§ã¯ãããŸããã
åé¡ïŒ47ãšåãäœæ¥ãå¿
èŠã§ãã
ãããŒã 圱é¿ãåããã®ã¯äž»ã«æ åœè ã§ãããããæ£ããããšããã£ããè¡ãããšã¯åé¡ãããŸããã å®è¡æã«ããããéå§ãããããšã¯ã»ãšãã©ãããŸãããã€ã³ã¿ã©ã¯ãã£ããªå Žåãé€ããŠããªã誰ããäœããå®çŸ©ããŠããããããåå®çŸ©ããã®ã§ããããã ãœãªã¥ãŒã·ã§ã³ãå€ãã®ãªãŒããŒããããåŒãèµ·ããããšã«ãªã£ãå Žåããããããããåãã®ã¯ãªãã·ã§ã³ã§ãããæ åœè ã§èªåçã«è¡ãããã¹ãã§ããïŒ
ããã¯çŸåšæªå®çŸ©ã§ããããšãææžåããå¿ èŠããããŸãã
æè¡çã«ã¯ãããã¯ãã°ã§ã¯ãªããæªå®çŸ©ã®åäœã§ãã ã¡ãœãããåå®çŸ©ãããšãçµæã®åäœã¯æªå®çŸ©ã«ãªããŸãã ãã®ããããžã¥ãªã¢ã¯çŸåšè¡ã£ãŠããããšãå«ãã奜ããªããšãäœã§ãã§ããŸãã ã¡ãœããã®åå®çŸ©æã«æ確ã«å®çŸ©ãããåäœãæäŸããããšã¯æ©èœã§ããããã°ä¿®æ£ã§ã¯ãããŸããã ãŸããæªå®çŸ©ã®åäœããæ確ã«å®çŸ©ãããåäœãæäŸããããšã¯é倧ãªå€æŽã§ã¯ãªãããããããv1.0ã®åé¡ã§ãããšã¯ç¢ºä¿¡ããŠããŸããã ããã¯ãæå¹ãªv1.0ã³ãŒããå£ãããšãªãv1.1ã§å®è£ ã§ããŸãã
Appleã®LLVM / LLDBã¹ã¿ããã®GregClaytonã¯èŠªåã«ããåã蟌ãŸããã·ã³ãã«æ å ±ïŒã·ã³ãã«ã€ã³ããŒãïŒãããã€ããªã®äŸåé¢ä¿ã決å®ããããã«å¿ èŠãªæ å ±ãïŒlldbã©ã€ãã©ãªãllvmã®ãµããããžã§ã¯ãã§ïŒåŒãåºãæ¹æ³ãææžåããŠãããŸããã ãã€ããªã«ãã£ãŠãšã¯ã¹ããŒããããã·ã³ãã«ãšåæ§ã«ïŒå®å šãªäŸåé¢ä¿ã°ã©ããäœæããããã«å¿ èŠïŒã
2012幎3æ31æ¥ååŸ11æ2åããžã§ã€ãœã³E.ã¢ãã³ã¯æ¬¡ã®ããã«æžããŠããŸãã
LLDBæ奜家ã®çæ§ã
lldbã©ã€ãã©ãª/ã©ã€ãã©ãªã䜿çšããŠãïŒdyldinfo -lazy_bind -exportsã®åºåãšåæ§ã«ïŒã·ã³ãã«ã®2ã€ã®ãªã¹ããè¿ãOSXã§å®è¡ãããŠããç¹å®ã®ã³ãŒãã眮ãæããããšãã§ãããã©ããçåã«æã£ãŠããŸã
ïŒ; ã€ãŸãããã€ããªå ±æãªããžã§ã¯ããŸãã¯ãã³ãã«ã«ãã£ãŠã€ã³ããŒãããã³ãšã¯ã¹ããŒããããã·ã³ãã«ãäžèŠ§è¡šç€ºããå¿ èŠããããŸãã ç§ã®æã¿ã¯ãlldbã©ã€ãã©ãªã䜿çšããããšã§ãOSXã§ãLinuxãšåãã¯ã©ã€ã¢ã³ãã³ãŒãã䜿çšã§ããããã«ãªãããšã§ããã ïŒLinuxããŒãžã§ã³ã®ã³ãŒãã¯çŸåšlibbfdãšlibdldã䜿çšããŠåãããšãè¡ã£ãŠããŸãããåŸè ã¯ã»ãšãã©æ/ã¡ã³ããã³ã¹ãååŸããŠããŸããïŒã
include / lldb /ã調ã¹ãŠããŸããããã¯ãlldbãæ©èœããããã«ãããšåãæ å ±ïŒã€ã³ããŒããããã·ã³ãã«ãªã¹ããšMach-Oãã¡ã€ã«ã®ãšã¯ã¹ããŒããããã·ã³ãã«ãªã¹ãïŒãå¿ èŠãªããã§ããã䜿çšããAPIãæ確ã§ã¯ãããŸããã lldbã®ãµã³ãã«ã³ãŒããžã®ãã¹ãŠã®ææ¡/ãã€ã³ã¿ã¯å€§æè¿ã§ãïŒ
ããããšãããããŸããã
ãžã§ã€ãœã³dyldinfoãäœãããã®ãããããªãå Žåã®ããã«ãããã«äŸã瀺ããŸã:(ãã ããã¢ãã¬ã¹ãã»ã°ã¡ã³ããã»ã¯ã·ã§ã³ã§ã¯ãªããã·ã³ãã«åã®ã¿ãå¿ èŠã§ãïŒïŒ
$ãã¡ã€ã«/ tmp / sample_bundle
/ tmp / sample_bundleïŒMach-O64ããããã³ãã«x86_64$ dyldinfo -lazy_bind -export / tmp / sample_bundle
é 延ãã€ã³ãã£ã³ã°æ å ±ïŒdyldæ å ±ã®lazy_bindéšåããïŒïŒ
ã»ã°ã¡ã³ãã»ã¯ã·ã§ã³ã¢ãã¬ã¹ã€ã³ããã¯ã¹dylibã·ã³ãã«
__DATA __la_symbol_ptr 0x000010300x0000ãã©ããåå空é__mm_pop_chunk
__DATA __la_symbol_ptr 0x00001038 0x0015 flat-namespace _dh_define
æ å ±ã®ãšã¯ã¹ããŒãïŒãã©ã€ããïŒïŒ
0x000008A0 _C_ipair
0x00000920 _init_ipair
0x00000BC0 _C_iprot
0x00000C40 _C_ipi2
0x00000CC0 _C_ipi1
0x00001040 _K_ipair_R43808f40
0x00001160 _K_ipi1_R5cb4475d
0x00001260 _K_ipi2_R5cb4475d
0x00001360 _K_iprot_Rfc8fe739
0x00001460 _majver_ipair
0x00001464 _minver_ipair
2012幎4æ2æ¥æææ¥ååŸ3æ13åãGreg [email protected]ã¯æ¬¡ã®ããã«æžããŠããŸãã
Yes you can do this with LLDB. If you load a binary and dump its symbol table, you will see the information you want. For symbols that are lazily bound, you can look for "Trampoline" symbols:
cd lldb/test/lang/objc/foundation
make
lldb a.out
(lldb) target modules dump symtab a.out
Symtab, file = .../lldb/test/lang/objc/foundation/a.out, num_symbols = 54:
Debug symbol
|Synthetic symbol
||Externally Visible
|||
Index UserID DSX Type File Address/Value Load Address Size Flags Name
------- ------ --- ------------ ------------------ ------------------ ------------------ ---------- ----------------------------------
[ 0] 0 D SourceFile 0x0000000000000000 Sibling -> [ 15] 0x00640000 /Volumes/work/gclayton/Documents/src/lldb/test/lang/objc/foundation/main.m
[ 1] 2 D ObjectFile 0x000000004f79f1ca 0x0000000000000000 0x00660001 /Volumes/work/gclayton/Documents/src/lldb/test/lang/objc/foundation/main.o
[ 2] 4 D Code 0x00000001000010f0 0x00000000000000c0 0x000e0000 -[MyString initWithNSString:]
[ 3] 8 D Code 0x00000001000011b0 0x0000000000000090 0x000e0000 -[MyString dealloc]
[ 4] 12 D Code 0x0000000100001240 0x00000000000000a0 0x000e0000 -[MyString description]
[ 5] 16 D Code 0x00000001000012e0 0x0000000000000020 0x000e0000 -[MyString descriptionPauses]
[ 6] 20 D Code 0x0000000100001300 0x0000000000000030 0x000e0000 -[MyString setDescriptionPauses:]
[ 7] 24 D Code 0x0000000100001330 0x0000000000000030 0x000e0000 -[MyString str_property]
[ 8] 28 D Code 0x0000000100001360 0x0000000000000050 0x000e0000 -[MyString setStr_property:]
[ 9] 32 D Code 0x00000001000013b0 0x0000000000000040 0x000f0000 Test_Selector
[ 10] 36 D Code 0x00000001000013f0 0x0000000000000130 0x000f0000 Test_NSString
[ 11] 40 D Code 0x0000000100001520 0x0000000000000120 0x000f0000 Test_MyString
[ 12] 44 D Code 0x0000000100001640 0x00000000000001b0 0x000f0000 Test_NSArray
[ 13] 48 D Code 0x00000001000017f0 0x00000000000000e1 0x000f0000 main
[ 14] 56 D X Data 0x0000000100002680 0x0000000000000000 0x00200000 my_global_str
[ 15] 58 D SourceFile 0x0000000000000000 Sibling -> [ 19] 0x00640000 /Volumes/work/gclayton/Documents/src/lldb/test/lang/objc/foundation/my-base.m
[ 16] 60 D ObjectFile 0x000000004f79f1ca 0x0000000000000000 0x00660001 /Volumes/work/gclayton/Documents/src/lldb/test/lang/objc/foundation/my-base.o
[ 17] 62 D Code 0x00000001000018e0 0x0000000000000020 0x000e0000 -[MyBase propertyMovesThings]
[ 18] 66 D Code 0x0000000100001900 0x000000000000001f 0x000e0000 -[MyBase setPropertyMovesThings:]
[ 19] 82 Data 0x0000000100002000 0x0000000000000460 0x000e0000 pvars
[ 20] 83 ObjCIVar 0x0000000100002518 0x0000000000000148 0x001e0000 MyBase.propertyMovesThings
[ 21] 84 X Data 0x0000000100002660 0x0000000000000008 0x000f0000 NXArgc
[ 22] 85 X Data 0x0000000100002668 0x0000000000000008 0x000f0000 NXArgv
[ 23] 86 X ObjCClass 0x00000001000024d8 0x0000000000000028 0x000f0000 MyBase
[ 24] 87 X ObjCClass 0x0000000100002460 0x0000000000000028 0x000f0000 MyString
[ 25] 88 X ObjCIVar 0x0000000100002510 0x0000000000000008 0x000f0000 MyString._desc_pauses
[ 26] 89 X ObjCIVar 0x0000000100002508 0x0000000000000008 0x000f0000 MyString.date
[ 27] 90 X ObjCIVar 0x0000000100002500 0x0000000000000008 0x000f0000 MyString.str
[ 28] 91 X ObjCMetaClass 0x00000001000024b0 0x0000000000000028 0x000f0000 MyBase
[ 29] 92 X ObjCMetaClass 0x0000000100002488 0x0000000000000028 0x000f0000 MyString
[ 30] 97 X Data 0x0000000100002678 0x0000000000000008 0x000f0000 __progname
[ 31] 98 X Data 0x0000000100000000 0x00000000000010b0 0x000f0010 _mh_execute_header
[ 32] 99 X Data 0x0000000100002670 0x0000000000000008 0x000f0000 environ
[ 33] 101 X Data 0x0000000100002680 0x0000000000000000 0x000f0000 my_global_str
[ 34] 102 X Code 0x00000001000010b0 0x0000000000000040 0x000f0000 start
[ 35] 103 Trampoline 0x0000000100001938 0x0000000000000006 0x00010200 NSLog
[ 36] 104 X Undefined 0x0000000000000000 0x0000000000000000 0x00010400 OBJC_CLASS_$_NSArray
[ 37] 105 X Undefined 0x0000000000000000 0x0000000000000000 0x00010200 OBJC_CLASS_$_NSAutoreleasePool
[ 38] 106 X Undefined 0x0000000000000000 0x0000000000000000 0x00010400 OBJC_CLASS_$_NSDate
[ 39] 107 X Undefined 0x0000000000000000 0x0000000000000000 0x00010400 OBJC_CLASS_$_NSObject
[ 40] 108 X Undefined 0x0000000000000000 0x0000000000000000 0x00010200 OBJC_CLASS_$_NSString
[ 41] 109 X Undefined 0x0000000000000000 0x0000000000000000 0x00010400 OBJC_METACLASS_$_NSObject
[ 42] 110 X Undefined 0x0000000000000000 0x0000000000000000 0x00010400 __CFConstantStringClassReference
[ 43] 111 X Undefined 0x0000000000000000 0x0000000000000000 0x00010100 _objc_empty_cache
[ 44] 112 X Undefined 0x0000000000000000 0x0000000000000000 0x00010100 _objc_empty_vtable
[ 45] 113 Trampoline 0x000000010000193e 0x0000000000000006 0x00010300 exit
[ 46] 114 Trampoline 0x0000000100001920 0x0000000000000006 0x00010100 objc_getProperty
[ 47] 115 Trampoline 0x0000000100001926 0x0000000000000006 0x00010100 objc_msgSend
[ 48] 116 Trampoline 0x000000010000192c 0x0000000000000006 0x00010100 objc_msgSendSuper2
[ 49] 117 X Undefined 0x0000000000000000 0x0000000000000000 0x00010100 objc_msgSend_fixup
[ 50] 118 Trampoline 0x0000000100001932 0x0000000000000006 0x00010100 objc_setProperty
[ 51] 119 Trampoline 0x0000000100001944 0x0000000000000006 0x00010300 printf
[ 52] 120 Trampoline 0x000000010000194a 0x0000000000000006 0x00010300 usleep
[ 53] 121 X Undefined 0x0000000000000000 0x0000000000000000 0x00010300 dyld_stub_binder
(lldb)
All lazily bound symbols will have type Trampoline:
[ 45] 113 Trampoline 0x000000010000193e 0x0000000000000006 0x00010300 exit
[ 46] 114 Trampoline 0x0000000100001920 0x0000000000000006 0x00010100 objc_getProperty
[ 47] 115 Trampoline 0x0000000100001926 0x0000000000000006 0x00010100 objc_msgSend
[ 48] 116 Trampoline 0x000000010000192c 0x0000000000000006 0x00010100 objc_msgSendSuper2
[ 50] 118 Trampoline 0x0000000100001932 0x0000000000000006 0x00010100 objc_setProperty
[ 51] 119 Trampoline 0x0000000100001944 0x0000000000000006 0x00010300 printf
[ 52] 120 Trampoline 0x000000010000194a 0x0000000000000006 0x00010300 usleep
The other symbols that are exernal are marked with an "X" (which is a boolean flag on each symbol).
The symbols can be accessed via the SBModule:
size_t
SBModule::GetNumSymbols ();
lldb::SBSymbol
SBModule::GetSymbolAtIndex (size_t idx);
And then you can get the symbol type from each SBSymbol:
SymbolType
SBSymbol::GetType ();
I just added the ability to see if a symbol is externally visible:
% svn commit
Sending include/lldb/API/SBSymbol.h
Sending scripts/Python/interface/SBSymbol.i
Sending source/API/SBSymbol.cpp
Transmitting file data ...
Committed revision 153893.
bool
SBSymbol::IsExternal();
So your flow should be:
SBDebugger::Initialize();
SBDebugger debugger(SBDebugger::Create());
SBTarget target (debugger.CreateTarget (const char *filename,
const char *target_triple,
const char *platform_name,
bool add_dependent_modules,
lldb::SBError& error));
SBFileSpec exe_file_spec (filename);
SBModule exe_module (target.FindModule(exe_file_spec));
if (exe_module.IsValid()
{
const size_t num_symbols = exe_module. GetNumSymbols();
for (size_t i=0; i<num_symbols; ++i)
{
SBSymbol symbol (exe_module. GetSymbolAtIndex(i));
if (symbol.IsExternal())
{
}
if (symbol.GetType() == lldb::eSymbolTypeTrampoline)
{
}
}
}
> _______________________________________________
> lldb-dev mailing list
> [email protected]
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
2012幎4æ2æ¥æææ¥ã®ååŸ4æ5åãGreg [email protected]ã¯æ¬¡ã®ããã«æžããŠããŸãã
A quick clarification on the args to CreateTarget:
"filename" is just a full path to the local object file you want to observer. "target_triple" is your <arch>-<vendor>-<os>, or something like "x86_64-apple-darwin" or "i386-pc-linux" and can be NULL if the file is only a single architecture. "platform_name" can be NULL. "add_dependent_modules" should be false, since you are only interested in seeing the one object file itself, an SBError instance should be created and passed in.
ããã¯é©ãã»ã©å€ãã¹ã¬ãããæµæž«ããŠããŸãããcodespeedãã³ãããŒã¯ã³ãŒãã§ãã®åé¡ã®ç«¯ããã¡ãã€ãå¯èœæ§ãããããšã«æ°ã¥ããŸããã listTests()
ãšrunTests()
ã€ã®é¢æ°ãå«ãCore.include()
ãã¡ã€ã«ãç¹°ãè¿ãå®è¡ããŸãã 次ã«ã listTests()
ãšrunTests()
ãåŒã³åºãã ãã§ãæ°ãããã³ãããŒã¯ãã¡ã€ã«ãããŒããããã³ã«åå®çŸ©ããŠåŒã³åºãããšãã§ããŸãã ç§ã¯ç¬¬2å±€ã®é¢æ°ãåå®çŸ©ããŠããªãã®ã§ãããã«ãªã¹ããããŠããåé¡ã«ééããããšã¯ãªããšæããŸããããã®ãããªãã®ãåå®çŸ©ããããšã¯ãåããAPIãã§è€æ°ã®ãã¡ã€ã«ãããŒãããããã®æªãæ¹æ³ã§ããïŒ
ããããã¢ãžã¥ãŒã«ã«ç¹°ãè¿ãå«ããæ¹ãè¯ããããããŸããããéçºãªã¹ãã§ãæèµ·ãããŠããå¿åã¢ãžã¥ãŒã«ã®åé¡ã«ã¶ã€ããããšã«æ°ã¥ããŸããã ãã ãããã®å Žåã¯ãåãã¢ãžã¥ãŒã«ãè€æ°åå®çŸ©ããŠãçºçããèŠåãç¡èŠã§ãããããåé¡ãªãå ŽåããããŸãã
ããããå€ãã¹ã¬ããã§ãããçžå€ãããé¢é£æ§ããããŸãã
ããããå¥ã®ã¢ãããŒãã¯ã evalfile
ã䜿çšããŠããã¡ã€ã«ã«é¢æ°ã®ã¿ãã«ããè¿ããããšã§ãã å¿åã¢ãžã¥ãŒã«ã®åé¡ã¯äœã§ããïŒ
ç§ã¯ãããåç §ããŠããŸããïŒ https ïŒ
å®è£ æŠç¥ã«ã€ããŠä»ã«èããŠãã人ã¯ããŸããïŒ ïŒæé©åãããŠããªãASTã«åºã¥ããŠïŒæ°ããã¡ãœãããäœæããããã³ã«æŽæ°ãããéã³ãŒã«ã°ã©ããç¶æããåçŽãªã¹ããŒã ãã³ãŒãã£ã³ã°ããããšãèããŠããŸããã 次ã«ãã¡ãœãããåå®çŸ©ããããšãã«ãã®ã°ã©ãããŠã©ãŒã¯ããåå®çŸ©ãããåé¢æ°ã®åå«ã®ã³ã³ãã€ã«æžã¿ããŒãžã§ã³ãåé€ããŸãã
ããã¯ãä»ã®æ¹æ³ãšåããããåççãªã¢ãããŒãã§ãã ããªãããããããæ°ã«ãªã£ãŠãããšæããŠãããªããç§ã¯å ã«é²ãã§ãäœãèµ·ãããèŠãŠã¿ãŸãããïŒ
åŒã³åºãå ã®_execution_ãåŒã³åºãå ã®åã³ã³ãã€ã«ãããªã¬ãŒãããšã©ããªããŸããïŒ
ãã®åé¡ã解決ãããšãREPLã§ã®ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãè¶ ããèå³æ·±ãçµæãããããããå¯èœæ§ãããããšã«é ããŠæ°ä»ããã®ã§ã質åããŸããã¡ã¿ããã°ã©ãã³ã°ã®åé¡ã«å¯Ÿãã究極ã®çããã€ãŸãå¹ççãªã段éçãé¢æ°ã®äœæãå¯èœã«ãªãå¯èœæ§ããããŸãã ç¥ããªã人ã®ããã®èæ¯ãšããŠïŒããã€ãã®é¢æ°ã¯çŸåšã¡ã¿ããã°ã©ãã³ã°ã«ãã£ãŠå®è£ ãããŠããŸããç¹ã«ã¢ã«ãŽãªãºã ã®ããã€ãã®åŽé¢ãéèŠãªæ¹æ³ã§å ¥åã®ã¿ã€ãã«äŸåããŠãããã®---æšæºçãªäŸã¯é¢æ°æ¬äœã®ã«ãŒãã®æ°ã¯ãé åã®æ¬¡å ã«çãããªããŸãã éåžžãããåŠçããæ¹æ³ã¯ãããšãã°æ¬¡å 1ãš2ã«å¯ŸããŠé¢æ°ãæ瀺çã«å®çŸ©ãã次ã®ãããªã©ãããŒãäœæããããšã§ãã
_method_cache = Dict()
function myfunction(A::AbstractArray)
N = ndims(A)
if !haskey(_method_cache, N)
func = eval(<an expression that generates the function definition for N dimensions>)
_method_cache[N] = func
else
func = _method_cache[N]
end
return func(A)
end
ãããã£ãŠã4次å
é
åã«å¯ŸããŠåããŠmyfunction
ãå®è¡ããããšãæåã«4次å
ã«åºæã®ããŒãžã§ã³ãå®çŸ©ãããããã_method_cache
ã«è¿œå ãããŠãããå
¥åã®æ°ããé¢æ°ãè©äŸ¡ãããŸãã 4次å
é
åã䜿çšããmyfunction
ä»åŸã®åŒã³åºãã§ã¯ããã£ã¯ã·ã§ããªããå®çŸ©ãååŸããŠè©äŸ¡ããã ãã§ãã _method_cache
ã¯ãJuliaç¬èªã®å
éšã¡ãœããããŒãã«ãšäžŠè¡ããäžçš®ã®ãã·ã£ããŠã¡ãœããããŒãã«ãã§ããããã®ç¹å®ã®é¢æ°ã®ããã ãã«äœ¿çšãããŸãã ïŒéå
¬éã«ããããã«ãéåžžã¯let
ã«ãã»ã«åãããŸããïŒ
ãã®äŸã®ã¢ãããŒãã¯ãå®è¡ã«æéããããé¢æ°æ¬äœã«ã¯é©ããŠããŸãããèŸæžæ€çŽ¢ã«å¿ èŠãªæéãããçãæéã§å®è¡ãããé¢æ°ã«ã¯ããŸãé©ããŠããŸããããŸããå¿ èŠãªé¢æ°ã«ã¯ç¹ã«é©ããŠããŸãããã€ã³ã©ã€ã³åã§ããŸãã
ãããè¡ãããã®ããè¯ãæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
function myfunction(A::AbstractArray)
bodyexpr = <an expression for the body of the function specific for N dimensions>
f = <strong i="17">@eval</strong> begin
function myfunction(A::$(typeof(A)))
$bodyexpr
end
end
return f(A)
end
ããã§ã myfunction
ãããšããããã®ç¹å®ã®å
¥åã¿ã€ãã«å¯ŸããŠ_ããå
·äœçãª_ããŒãžã§ã³ã®myfunction
ããŸãã ãã®æ°ããå®çŸ©ãå©çšå¯èœã«ãªã£ãåŸã«ã³ã³ãã€ã«ãããã³ãŒãã¯ã該åœããå Žåã¯ãã®æ°ããããŒãžã§ã³ã䜿çšããŸãã äžèšã®ããŒãžã§ã³ã¯ãããå
·äœçãªãã®ããŸã å®çŸ©ããŠããªãå Žåã®äžè¬çãªããã©ãŒã«ããã¯ãã«ãªããŸãã ãããã£ãŠãããã¯ãJuliaç¬èªã®å
éšã¡ãœããããŒãã«ã¡ã«ããºã ã掻çšãã段éçãªé¢æ°ãäœæããæ¹æ³ã§ããããããã£ãŠãå¹ççãªã³ãŒããçæããããšãã§ããŸãã
çŸåšãããã¯1ã€ã®é倧ãªçç±ã§æ©èœããŸãããã€ãŸãã myfunction
ãšåŒã°ãããã®ã¯ãã¹ãŠãã§ã«ã³ã³ãã€ã«ãããŠãããããæ°ããå®çŸ©ã«ã€ããŠã¯ããããŸããã ãã®çµæããã®ç¹å®ã®åŒã³åºãå
ã¯åžžã«eval
ã䜿çšããŠmyfunction
æ°ããããŒãžã§ã³ãçæããŸãããããã¯éåžžã«é
ããªããŸãã
ãããã£ãŠãããªãã¯ã¯åŒã³åºãå ãåã³ã³ãã€ã«ããããšã§ãããããã¯_å®è¡ã®éäžã§_çºçããå¿ èŠãããããšã«æ³šæããŠãã ããã äœãèµ·ããã ããïŒ
ïŒ5395ãåç §ããŠãã ããã
å®éã«ã¯ã¡ãœããã®åå®çŸ©ã䌎ããªãããåæ§ã®åŠçãå¿ èŠãšããæœè±¡åã«é¢é£ããåé¡ããããŸãã èããŠã¿ãŸãããïŒ
abstract A
immutable B <: A; end
immutable C <: A; end
g(x::Vector{A}) = f(x[1])
f(::B) = 1
g(A[B()])
f(::C) = 0.5
g(A[C()])
æåŸã®è¡ã¯4602678819172646912
ãŸãã f(::A)
ã®åæšè«ãç¡å¹ã«ãªã£ãããã g
ã®ã³ãŒããç Žæ£ããå¿
èŠããããŸãã
ã¯ããããã¯éåžžã«æ確ã§ãã ã¡ãœããã®çœ®ãæãã¯1ã€ã®ç¹æ®ãªã±ãŒã¹ã«ãããªãããšãç§ãã¡ã¯ç¥ã£ãŠããŸãã ãã ããåžžã«æ°ããã¡ãœããå®çŸ©ãå«ãŸããŸãã
ãã以æ¥ãçŸåšã®ç¶æ³ã¯ã©ããããããææ§ã«ãªãå¯èœæ§ãããããã§ã
f() = x()
x() = 1
println(f())
x() = 2
println(f())
äžãã
1
1
äžæ¹
g() = y()
precompile(g, ())
y() = 1
println(g())
y() = 2
println(g())
äžãã
1
2
åŸè ã®ã±ãŒã¹ã¯ãåŒã³åºãå ã®åã³ã³ãã€ã«ããšãã¥ã¬ãŒãããããã®åé¿çãšããŠäœ¿çšã§ããããã§ãïŒå®éã«ã¯åã³ã³ãã€ã«ã§ã¯ãªãããšãç§ã¯ç¥ã£ãŠããŸãïŒã
æããªããšãèšãããšããŠãããããªæ°ãããŸããããã®åé¡ã¯åäžã¬ãã«ã®éæ¥åç §ã§è§£æ¶ã§ããŸããã§ãããïŒ é¢æ°ã¢ãã¬ã¹ãããŒãã³ãŒãã£ã³ã°ãã代ããã«ãåºå®ãããå Žæããæ€çŽ¢ããŠåŒã³åºããŸãã ããã¯ãC ++ãŸãã¯Javaä»®æ³é¢æ°ãšåæ§ã®ããã©ãŒãã³ã¹ãçºæ®ããŸãããïŒ æ¬¡ã«ãéçã¢ãã¬ã¹ãŸãã¯åçã¢ãã¬ã¹ãæã€ããã«é¢æ°ã«æ³šéãä»ããéçã¢ãã¬ã¹ã§é¢æ°ãåå®çŸ©ããããšãããšèŠå/ãšã©ãŒãçºçããå¯èœæ§ããããŸãã ããã©ã«ãã®æ©èœåäœãèšå®ããããã®ã¹ã€ãããããããããããŸããã ç§ã¯ãã®èšèªã«äžæ £ãã§ãã³ãŒãããŒã¹ã«ãŸã£ããæ £ããŠããŸãããããããå®çŸå¯èœã§ãããšæãããå Žåã¯ããžã£ããäžããããšãã§ãããšæããŸãã
@ omer4dãã®ã¢ã€ãã¢ã®1ã€ã®åé¡ã¯ãJuliaãå€ãã®å°ããªé¢æ°ãã€ã³ã©ã€ã³åãããããç¹å®ã®é¢æ°ã®ãã¹ãŠã®ãäŸåé¢ä¿ããæ€çŽ¢ããæ¹æ³ãå¿ èŠãªããšã§ãã
C ++ã®ããã«ãéçã¢ãã¬ã¹ãæã€ãã®ã ããã€ã³ã©ã€ã³åã§ããŸãã ããã§äžäŸ¿ãçããããšã¯ãããŸããã
ããã©ã«ãã®åäœã§ã¯ãã¹ãŠã®é¢æ°ã«éçã¢ãã¬ã¹ã䜿çšãããããã€ã³ã¿ã©ã¯ãã£ããªéçºãæ°ã«ããªã人ã¯ãŸã£ãã圱é¿ãåããŸããã
ããã©ãŒãã³ã¹ã¯æ°ã«ããªããã€ã³ã¿ã©ã¯ãã£ããªéçºãå¿
èŠãªäººã¯ãã¹ã€ããã䜿çšããŠãããã©ã«ãã§é¢æ°ã¢ãã¬ã¹ãåçã«ããããšãã§ããŸãã
察話æ§ãšããã©ãŒãã³ã¹ã®äž¡æ¹ãå¿
èŠãªäººã¯ãé¢é£ããé¢æ°ã«æ³šéãä»ããããšãã§ããŸãããã€ã³ã©ã€ã³åã¯é »ç¹ã«åŒã³åºãããçãäœã¬ãã«ã®é¢æ°ã«ã®ã¿é¢é£ãããããå€ãã®äœæ¥ã¯å¿
èŠãããŸããã
ãããããããã©ã«ãã®åäœã¯ã¢ãžã¥ãŒã«ããšã«èšå®ããããšãã§ããŸãã
ã¢ãããŒããå®è¡å¯èœã§ãªãçç±ã¯ããã€ããããšæããŸãã æåã
泚éã¯ãç¹ã«ãããã³ã°ããå¿
èŠãããå Žåãæ¬åœã«åä»ã§ãã
ãã®ãããªå®è£
ã®è©³çŽ°ã«ã€ããŠã 泚éã䜿çšããŠ2ã解決ããå Žå
ãŸãã¯3ã€ã®åé¡ããããã¯ããªãç©ã¿éãªã£ãŠãããŸãã 第äºã«ããããŸãã
é¢æ°ã«é©åãªæ³šéãéžæããããã®è¯ãæ¹æ³ã ãããŸãã
äœããã€ã³ã©ã€ã³åããããã©ãããšã
ã€ã³ã¿ã©ã¯ãã£ãã«éçºããŸãã 第äžã«ãä»ã®é¢æ°ã§ã®åæ§é€
å€æŽãå¿
èŠãªå Žåãããããããµã€ããåŒã³åºãã ãã§ã¯ãããŸããã å®éãç§ãã¡ã¯çŸåš
ç§ãã¡ãç©äºãäœãããšãã§ããå¯èœæ§ããããããå°ãªãã¿ã€ãæ
å ±ãå°ãåºã
ãã®åé¡ã«çŽé¢ããŠãå®å
šã§ãã
ããŠãæ°åã®ä¿®é£ŸåããŒã¯ãŒããšç¹°ãè¿ãã®æååã³ã³ãã€ã«ã䜿çšããŠèšèªã§ã»ãšãã©ã®äœæ¥ãè¡ã人ãšããŠãé¢æ°ã1ã€ã2ã€ä¿®é£Ÿããã€ã³ã¿ã©ã¯ãã£ããªéçºã®æ°ãµã€ã¯ã«åŸã«åã³ã³ãã€ã«ããå¿ èŠãããããšã¯ããã»ã©æªãã¯ãããŸããããããã¯ç§ã ãã§ãã ãããã3çªç®ã®ãã€ã³ãã«å¯ŸåŠããã®ã«ååãªç¥èããªãã®ã§ãèŸä»»ããŸãã åã³ã³ãã€ã«ãšã¯ãå€æŽãããé¢æ°ã®åŒã³åºãããªãŒã®ã«ãŒãã«ã²ãŒã ãŸãã¯ã¢ãã¡ãŒã·ã§ã³ã«ãŒããå«ãŸããŠããå ŽåããããçµäºããŠåèµ·åããå¿ èŠãããããããã®ãããªãœãªã¥ãŒã·ã§ã³ãå®è¡ã§ããªãã®ã¯æ®å¿µã ãšæããŸãã =ïŒ
@JeffBezansonå°ãªããšãæåã¯ãç°¡åãªã±ãŒã¹ã«ããããæãèå³ãããã§ãããã eval
ä»ããŠã¢ã¯ã»ã¹ããããã®ïŒããšãã°ãREPLããã³ããã§å
¥åããããã®ïŒãšã¯å¯Ÿç
§çã«ãå®è¡äžã®ã³ãŒããæŽæ°ãããããšã¯ããã»ã©æ°ã«ããŸããã æçµçã«ã¯ãããšãã°ãåå®çŸ©æã«åŒã³åºãããdisplay
ã®æ£ããããŒãžã§ã³ãååŸããããšãéèŠã«ãªããŸãã ããããããã«ãããã€ã³ã¯ãªã¡ã³ã¿ã«ã³ã³ãã€ã«ã«ããã«è¿ã¥ãããšãã§ãããšæããŸãã
ãã®åé¡ãç¥ã£ãŠå°ãé©ããã®ã¯ããããåŠçããã®ãç°¡åã ãšæãããã§ã¯ãªãã次ã®ããšãæåŸ ã©ããã«æ©èœããããã§ãã
julia> f(a, b) = a + b
f (generic function with 1 method)
julia> g(args...) = f(args...)
g (generic function with 1 method)
julia> g(1, 2)
3
julia> f(a::Int, b::Int) = a - b
f (generic function with 2 methods)
julia> g(1, 2)
-1
ç·šéïŒå®éãããã¯Varargå ¥åã®ç¹æ®ãªã±ãŒã¹ã®ããã«èŠããŸã.....ããã¯ãvarargé¢æ°ãåŒã³åºããããã³ã«åã³ã³ãã€ã«ãããããšãæå³ããŸããïŒ ãããšããå¿ èŠãªå Žåã«ã®ã¿åã³ã³ãã€ã«ããã®ã«ååè³¢ãã§ããïŒ ãããŠãä»ã®æ©èœãåãããã«æ±ãããšã¯å¯èœã§ããïŒ
julia> f(a, b) = a + b
f (generic function with 1 method)
julia> g(a, b) = f(a, b)
g (generic function with 1 method)
julia> g(1, 2)
3
julia> f(a::Int, b::Int) = a - b
f (generic function with 2 methods)
julia> g(1, 2)
3
å®éã«ã¯ãé¢æ°ã¯æ£ããçµæãè¿ããŸããã @code_typed
ã¯ééã£ãçµæãè¿ããŸã.....
julia> f(a, b) = a + b
f (generic function with 1 method)
julia> g(args...) = f(args...)
g (generic function with 1 method)
julia> g(1, 2)
3
julia> <strong i="7">@code_typed</strong> g(1, 2)
1-element Array{Any,1}:
:($(Expr(:lambda, Any[:(args::(top(apply_type))(Vararg,Any)::Any::Any)], Any[Any[],Any[Any[:args,(Int64,Int64),0]],Any[]], :(begin # none, line 1:
return (top(box))(Int64,(top(add_int))((top(tupleref))(args::(Int64,Int64),1)::Int64,(top(tupleref))(args::(Int64,Int64),2)::Int64))
end::Int64))))
julia> f(a::Int, b::Int) = a - b
f (generic function with 2 methods)
julia> g(1, 2)
-1
julia> <strong i="8">@code_typed</strong> g(1, 2)
1-element Array{Any,1}:
:($(Expr(:lambda, Any[:(args::(top(apply_type))(Vararg,Any)::Any::Any)], Any[Any[],Any[Any[:args,(Int64,Int64),0]],Any[]], :(begin # none, line 1:
return (top(box))(Int64,(top(add_int))((top(tupleref))(args::(Int64,Int64),1)::Int64,(top(tupleref))(args::(Int64,Int64),2)::Int64))
end::Int64))))
ãããŠ
julia> f(a, b) = a + b
f (generic function with 1 method)
julia> g(args...) = f(args...)
g (generic function with 1 method)
julia> g(1, 2)
3
julia> f(a::Int, b::Int) = a - b
f (generic function with 2 methods)
julia> g(1, 2)
-1
julia> <strong i="12">@code_typed</strong> g(1, 2)
1-element Array{Any,1}:
:($(Expr(:lambda, Any[:(args::(top(apply_type))(Vararg,Any)::Any::Any)], Any[Any[],Any[Any[:args,(Int64,Int64),0]],Any[]], :(begin # none, line 1:
return (top(box))(Int64,(top(sub_int))((top(tupleref))(args::(Int64,Int64),1)::Int64,(top(tupleref))(args::(Int64,Int64),2)::Int64))
end::Int64))))
é¢æ°ã®ã¡ãœããïŒãŸãã¯é¢æ°ã¿ã€ã/ãªããžã§ã¯ãèªäœã®ã¿ïŒã«ãäœããå²ãåœãŠããããã³ã«å€åããçªå·ãã€ã³ããã¯ã¹ä»ãããŠãã³ã³ãã€ã«ãããïŒåŒã³åºãå
ïŒé¢æ°ã«æ ŒçŽãããŠããçªå·ïŒã€ãŸããæ°ããæ§é ã䜿çšããŠãããã©ããïŒã確èªã§ããããã«ãªããŸããïŒé¢æ°ã®æ°ããããã®æ°å€ããã£ãŒã«ããšããŠä¿åãããªã©ïŒã¯ãã€ã³ã©ã€ã³åãããïŒåŒã³åºãããïŒé¢æ°ã§ãçŸåšãã®ãã®ãšäžèŽããŸããïŒ
ïŒãã¡ãã倧ããªããã©ãŒãã³ã¹ããã«ãã£ãªãã§ïŒ
ãŸããå€æŽããã£ãå Žåã¯ãæ°ããããŒãžã§ã³ãã³ã³ãã€ã«ããããæ瀺çã«åŒã³åºãããšãæ€èšããŠãã ããã
ããã«ãããããã©ãŒãã³ã¹ãžã®åœ±é¿ãã©ã³ã¿ã€ã ã«ç§»åããŸãïŒãããŠãããã¯ã©ãã«ã§ããããŸãïŒãããã¯æãŸãããããŸããã å¿ èŠãªã®ã¯ãäŸåé¢ä¿ã®Webã远跡ããã¡ãœãããéšåçã«åå®çŸ©ããããšãã«åœ±é¿ãåããå¯èœæ§ã®ãããã®ããã¹ãŠåã³ã³ãã€ã«ããããšã§ãã ããã¯ããããå®è¡å¯èœã§ããããã¯ãã ã®_倧èŠæš¡ãª_çã¿ã§ãã
ãã®åé¡ã®è§£æ±ºçããã¯ãã«ç°¡åã«äžè¬åã§ãããã©ããã¯ããããŸããããããã§ããã°ããããããã°ããã®ã§ããã
ãããã£ãŠãéã«ãé¢æ°ãã€ã³ã©ã€ã³åãããã¹ãŠã®ã¡ãœãããæ ŒçŽããå€æŽæã«ããããåã³ã³ãã€ã«ããå¿ èŠããããŸãã ïŒãã¡ãããçŸåšã®å®è¡ãªã©ããã§ãã¯ããŸãïŒ
ããã§ã®é£ããåé¡ã¯æ¬¡ã®ãšããã§ãã
åé¡ã®è§£æ±ºã«åãçµãã§ããéãç§ã¯ãããå¯èœãã©ããèå³ããããäžããããé¢æ°ãäžäœã®æ¹æ³ã®ããããã§äœ¿çšãããå Žåã«ã®ã¿ãèšå®ããããã¹ãŠã®é¢æ°ã«ãã©ã°ãè¿œå ããããšããå§ãããŸãïŒã€ã³ã©ã€ã³åãªã©ïŒã€ã³ã©ã€ã³åãããã¡ãœãããåå®çŸ©ããããšããèŠåãçæããããã ïŒãããŸããªèŠåãæ©èœããæ¹æ³ãšåæ§ïŒ
ãã©ã°ãä¿åããããè¯ãæ¹æ³ããªãå Žåã¯ãããããjulia0.5ã®ã¡ãœãã/é¢æ°ã®æ°ããæ§é ã䜿çšããããšã«ãã£ãŠ
replã§ããããããããã®ã¯ããã«ç°¡åã«ãªãããã®åäœã¯ãããçšã«ææžåããå¿ èŠããããŸããïŒ
julia> function f(x)
1
end
f (generic function with 1 method)
julia> map(f, 1:10)
10-element Array{Int64,1}:
1
1
1
1
1
1
1
1
1
1
julia> function f(x)
2
end
WARNING: Method definition f(Any) in module Main at REPL[9]:2 overwritten at REPL[11]:2.
f (generic function with 1 method)
julia> map(f, 1:10)
10-element Array{Int64,1}:
1
1
1
1
1
1
1
1
1
1
ããã¯ãŸã ããã©ïŒ265ã§ãã ããã¯v0.6-devã§ãŸããªãä¿®æ£ãããããšãç解ããŠããã ãããšæããŸã:)
@vtjnashã©ã³ã¿ã€ã ããã©ãŒãã³ã¹ãŸãã¯ã¡ã¢ãªã®ãã¬ãŒããªãã¯ãããŸããïŒ
å°ãã®ã¡ã¢ãªïŒ140MB-> 170 MBïŒãå¿ èŠã§ãããããã©ãŒãã³ã¹ïŒã³ã³ãã€ã«ãŸãã¯ã©ã³ã¿ã€ã ïŒã«å€§ããªåœ±é¿ãäžããããšã¯ãããŸããã ãããŠãç§ã¯ãŸã ããŸãæé©åãè©Šã¿ãŠããŸããã
ãããŸã§ã®ãã¢ã¯æ¥œããã§ãïŒ
julia> f() = 1
f (generic function with 1 method)
julia> function g(x)
<strong i="7">@eval</strong> f() = $x # this is the correct way to write `global f() = x` (which should be a syntax error, but isn't currently)
return @eval(f)() # use `eval` to hide the value from optimization / inlining, but the call is not inside eval
end
g (generic function with 1 method)
julia> g(2)
WARNING: Method definition f() in module Main at REPL[1]:1 overwritten at REPL[2]:2.
1
julia> g(3)
WARNING: Method definition f() in module Main at REPL[2]:2 overwritten at REPL[2]:2.
2
julia> g(4)
WARNING: Method definition f() in module Main at REPL[2]:2 overwritten at REPL[2]:2.
3
2ã3ãé åºã«ãã4ã§ã³ã³ãã€ã«è¿ããªãçç±ã§ããg
åå®çŸ©ããããšãå®è¡å¯Ÿf
èµ·ããã®ã§ã¯ïŒ
ãããŸãã«ããã§ãã èšèªã»ãã³ãã£ã¯ã¹ã¯ã³ã³ãã€ã«ãå®çŸ©ããªãããšã«æ³šæããŠãã ããããããã£ãŠã g
ã解éãããé åºãšã f
ã®åå®çŸ©ãã€ã³ã¿ãŒããªã¿ãŒã«è¡šç€ºãããæéãšã®æ¯èŒã®æ¹ãæ£ãããšèšããŸãã
äºè§£ããŸããã +
ããªããã£ããåå®çŸ©ããŠã䜿çšéãã«ãŠã³ãããããã1ã€ã®æ¥œããå°ããªãã¢ã次ã«ç€ºããŸãã
julia> add_ctr = UInt(0)
0x0000000000000000
julia> Base.:+(a::Int, b::Int) = (global add_ctr += 1; Core.Intrinsics.add_int(a, b))
julia> add_ctr
0x0000000000000016
julia> last = 0;
julia> println(Int(add_ctr - last)); last = add_ctr;
287
julia> println(Int(add_ctr - last)); last = add_ctr;
17
ããã¯ããŸããã§ãã +
ãBaseã«ãã£ãŠäœ¿çšãããããšã¯ãŸã£ãããªããšæãã®ã§ãåã³ã³ãã€ã«ãããã®ã¯äœããããŸããã§ããã svd
ãããªãREPLã衚瀺ãããåã«å°ãªããšã100ååŒã³åºãããå¿
èŠãããããšãããã£ãŠããå®éã®é¢æ°ãåå®çŸ©ããŸãã ããããç§ãã¡ã¯æåããã§ãããã
ãããã¡ã€ãªã³ã°/ãã¬ãŒã¹çšã®ã³ãŒããã©ã€ãã§åã€ã³ã¹ãã«ã¡ã³ãåããæ©äŒã¯ç§ãé©ãããŠããŸãã
確ãã«ã ãããŠãããã§ç§ã¯æ°ããããŒããŒãã賌å
¥ããããšããŠããŸããããªããªããã·ãŒã±ã³ã¹Ctrl-D; julia<Enter>
ã¯ã»ãšãã©äœ¿ãå€ãããŠããããã§ãã ç§ã¯ããå¿
èŠããªãããã«èŠããŸãã
ãªãªãŒã¹ããŒãã«å
¥ããã®ã¯å°ãé£è§£ãããããŸããããå
å
è¡šèšãcollect
-ing Generator
æ§æã«ãªã£ãŠããããšã«æ³šæããŠãã ããïŒãããã解æã¬ãã«ã®ãã®ãšã¯å¯Ÿç
§çã§ãïŒ 0.4ã§ã¯ïŒ- @which
ã¯ããã§ã¯æ©èœããŸããïŒïŒ ãã®äŸã¯ãäžèšã®vchuravyãšåæ§ã«ãåé¢æ°ã0.5ã®åã«ãªã£ãããšãèæ
®ããŠããã¡ãã£ãšããèœãšãç©Žã§ãã
_
_ _ _(_)_ | A fresh approach to technical computing
(_) | (_) (_) | Documentation: http://docs.julialang.org
_ _ _| |_ __ _ | Type "?help" for help.
| | | | | | |/ _` | |
| | |_| | | | (_| | | Version 0.5.0-rc3+0 (2016-08-22 23:43 UTC)
_/ |\__'_|_|_|\__'_| |
|__/ | x86_64-linux-gnu
julia> f(x) = 1
f (generic function with 1 method)
julia> [f(x) for x in 1:5]
5-element Array{Int64,1}:
1
1
1
1
1
julia> f(x) = 2
WARNING: Method definition f(Any) in module Main at REPL[1]:1 overwritten at REPL[3]:1.
f (generic function with 1 method)
julia> [f(x) for x in 1:5]
5-element Array{Int64,1}:
1
1
1
1
1
julia> <strong i="9">@which</strong> [f(x) for x in 1:5]
collect(itr::Base.Generator) at array.jl:295
ãããããªãã§ãããïŒ
ä¿®æ£ïŒ265ã«åœ¹ç«ã¡ãŸã
ããã¯æ¬åœã«ä¿®æ£ãããŠããŸããð²
ãã®ãœãªã¥ãŒã·ã§ã³ã¯ãŸã 0.5.xã«ããã¯ããŒããããäºå®ã§ããïŒ
çªå·ã
@ rapus95 ãããã¯éåžžã«äŸµè¥²çãªå€æŽã§ããããããééãããšãå€ãã®ãŠãŒã¶ãŒã®
ãã®åé¡ã®é²å±ãèŠãŠãšãŠãããããã§ãïŒ ããã«ãããã³ã³ãã€ã©ãhttps://groups.google.com/forum/#!topic/julia -users / OBs0fmNmjCUã§èª¬æãããŠããã±ãŒã¹ãæé©åã§ããããã«ãªãã°é©ãã¹ãããšã§ãã
ã¯ãªã ãªããŠçŽ æŽãããç¬éã§ãããã
ããã«ã¡ã¯ãã¿ããªïŒ
ãã®ä¿®æ£ã0.5ã·ãªãŒãºã«ããã¯ããŒãããå¯èœæ§ã¯ãããŸããïŒ ãããšãã0.6ã«ãªããã®ã§ã®ã¿æ©èœããŸããïŒ
ããã¯é倧ãªå€æŽã§ããã0.6ã§ã®ã¿å©çšå¯èœã«ãªããŸã
ãããä¿®æ£ããããšãã©ãã»ã©çŽ æŽãããããèªåŒµããã®ã¯é£ããã§ãã å€ãç¿æ £ã¯äžçæžåœã«æ»ã¬ã®ã§ãç§ã¯æã ãžã¥ãªã¢ãäžå¿ èŠã«åèµ·åãããåæ§ç¯ãããããŸãããç§ãèŠããŠãããšããããã¯åé¡ãä¿®æ£ããããã®å®å šãªã²ãŒã ãã§ã³ãžã£ãŒã§ãã
æãåèã«ãªãã³ã¡ã³ã
ã¯ãªã ãªããŠçŽ æŽãããç¬éã§ãããã