Vim script ã§ãã©ã ãã使ãããï¼
ãã®è¨äºã¯ Vim Advent Calendar 2012 227æ¥ç®ã®è¨äºã«ãªãã¾ãã
ã©ã ãã§ããï¼ã©ã ãï¼
ä¾ãã°ãVim script ã§ããªã¬ãªã¬ fold ãä½ãããæãã³ã¼ã«ããã¯é¢æ°ãåãåãããæã«ã©ã ãã使ãããï¼ï¼ã¨æãäºãå¤ãã§ãã
ãããªæã« reti.vim ã使ç¨ããã°ã©ã ãï¼ã®ãããªãã®ï¼ã使ããã¨ãåºæ¥ã¾ãã
ã¾ã Vim script ã§ã©ã ãã«é¢ãã¦ã¯å»å¹´ã® Vim Advent Calendar 㧠mattn ãããå°ã触ãã¦ãã¾ãã
reti.vim ã¨ã¯ã³ã³ã»ãããéãã¾ããããã¡ããèªãã§ã¿ãã¨é¢ç½ãã§ãã
[ã¤ã³ã¹ãã¼ã«]
reti.vim ã使ç¨ãã¾ãã
ã¾ããreti.vim ã使ç¨ããã«ããã£ã¦ chained.vim ãã¤ã³ã¹ãã¼ã«ãã¦ããå¿
è¦ãããã¾ãã
NeoBundle "osyo-manga/vim-reti" NeoBundle "osyo-manga/vim-chained"
[ç°¡åãªä½¿ãæ¹]
ã©ã ãã¨ãã£ã¦ã Vim script ã§ã¯æ§æã¨ãã¦ã©ã ããå®ç¾©ããäºã¯åºæ¥ãªãã®ã§ãæååããé¢æ°ãçæããäºã«ãªãã¾ãã
" 第ä¸å¼æ°ã¨ç¬¬äºå¼æ°ãå ç®ãã¦è¿ãé¢æ°ãå®ç¾© " é¢æ°ã®å¼æ°ã«ã¯ a: ãä½¿ç¨ let F = reti#lambda("a:1 + a:2") echo F(2, 5) " => 7 echo F(7, -6) " => 1 echo reti#lambda("a:1 - a:2")(4, 9) " => -5
ãã®ããã«æååã§å¼ãè¨è¿°ãããã®å¼ãè©ä¾¡ããé¢æ°ã®åç
§ãè¿ãã¾ãã
ã¤ã¡ã¼ã¸ã¨ãã¦ã¯ Vim script ã®çµã¿è¾¼ã¿é¢æ°ã§ãã map() ã filter() ã«æ¸¡ãæååãããªæãã§ãã
ã¾ããä¸è¨ã®ãããªå¼ä»¥å¤ã«ãã³ãã³ããè©ä¾¡ãããã¨ãåºæ¥ã¾ãã
" ã³ãã³ããè©ä¾¡ããå ´å㯠":" ããå§ã¾ãå¿ è¦ããã let Echo = reti#lambda(":echo a:1") call Echo("homu") " => "homu" call Echo(42) " => 42
ãããå©ç¨ããã° map() ã filter() å
ã§ã³ãã³ããè©ä¾¡ããäºãåºæ¥ã¾ãã
call map(range(5), "reti#lambda(':echo a:1')(v:val)") " => " 0 " 1 " 2 " 3 " 4
[å¼ã®ä¸ã§ãã¼ã«ã«å¤æ°ãã¹ã¯ãªãããã¼ã«ã«å¤æ°ãåç §ãã]
ãã¦ãçµã¿è¾¼ã¿é¢æ°ã§ãã map() ã filter() ã§ã¯å¼ã®ä¸ã§ç´æ¥ãã¼ã«ã«å¤æ°ãã¹ã¯ãªãããã¼ã«ã«å¤æ°ãè¨è¿°ãã¦åç
§ããäºãåºæ¥ã¾ãã
let s:mami = "mami" echo map(range(5), "s:mami") " => ['mami', 'mami', 'mami', 'mami', 'mami'] function! s:func() let value = 1 echo filter(range(5), "value < v:val") " => [2, 3, 4] endfunction call s:func()
ããããreti.vim ã§ã¯ãã®ããã«å¤é¨ã®å¤æ°ãç´æ¥åç
§ããäºã¯ã§ãã¾ããã
å¤é¨ã®å¤æ°ãåç
§ãããå ´å㯠reti#lambda() ã®å¼æ°ã«æ示çã«ä½¿ç¨ããå¤æ°ã渡ãå¿
è¦ãããã¾ãã
let s:mami = "mami" " 第äºå¼æ°ã«å¤æ°ã®è¾æ¸ã渡ã " ãã®è¾æ¸ã®ãã¼ãå¤æ°ãå¼ã®ä¸ã§ä½¿ç¨ããäºãåºæ¥ã let F = reti#lambda("mami . a:1", { "mami" : s:mami }) echo F("mado") " => mamimado function! s:func() let value = 3 let F = reti#lambda("value + a:1", { "value" : value }) echo F(9) " => 12 endfunction call s:func()
ã¾ããVim script ã§ã® s: ãã¹ã¯ãªãããã¼ã«ã«å¤æ°ã®è¾æ¸ã l: ããã¼ã«ã«å¤æ°ã®è¾æ¸ã§ããäºãå©ç¨ããã°æ¬¡ã®ããã«ç°¡æ½ã«è¨è¿°ãããã¨ãåºæ¥ã¾ãã
let s:mami = "mami" let s:homu = "homu" " ã¹ã¯ãªãããã¼ã«ã«å¤æ°å ¨ã¦ã使ç¨åºæ¥ã let F = reti#lambda("mami . a:1 . homu", s:) echo F(" + ") " => ami + homu function! s:func() let value1 = 3 let value2 = 5 " ãã¼ã«ã«å¤æ°ãåæ§ let F = reti#lambda("(value1 + a:1) * value2", l:) echo F(9) " => 60 " 両æ¹åç §ããäºãå¯è½ let F = reti#lambda("(value1 + a:1) . mami", l:, s:) echo F(9) " => 12mami endfunction call s:func()
å¤é¨ã®å¤æ°ãåç
§ããå ´åã¯ãã®ããã«ãã¦ä½¿ç¨ãã¾ãã
ã¾ããlet ã使ç¨ãã¦å¤æ°ãå¼ã®ä¸ã§æ¸ãæããäºãåºæ¥ã¾ãã
let s:value = 0 let F = reti#lambda(":let value = 42", s:) echo s:value " => 0 call F() echo s:value " => 42
[èªèº«ãåç §ãã]
å帰å¦ççãè¡ãããæã«èªèº«ãåç
§ãããå ´åãããã¨æãã¾ãã
å¼ã®ä¸ã§ Self ã使ç¨ããäºã§èªèº«ãå¼ã³åºãäºãåºæ¥ã¾ãã
" Self ã§èªèº«ãè©ä¾¡ echo reti#lambda("a:1 == 1 ? a:1 : a:1 * Self(a:1 - 1)")(4) " => 42 " ã¯ã¤ãã¯ã½ã¼ããã¯ã³ã©ã¤ãã¼ã§è¨è¿°ããã let list = [3, 2, 7, 1, 9, 8, 4, 6, 5] echo reti#lambda('a:1 == [] ? [] : Self(filter(copy(a:1), "v:val < a:1[0]")) + [a:1[0]] + Self(filter(copy(a:1), "a:1[0] < v:val"))')(list) " => [1, 2, 3, 4, 5, 6, 7, 8, 9]
[äºé æ¼ç®åãé¢æ°]
ãã¦ãreti.vim ã«ã¯å¼ãé¢æ°åãã以å¤ã«ãããã¤ãæ©è½ãããã¾ãã
ä¾ãã°äºé
æ¼ç®åã渡ããå ´åã2ã¤ã®å¼æ°ãåãåãé¢æ°ã®åç
§ãè¿ãã¾ãã
" reti#lambda("a:1 + a:2") ã¨ç価 let F = reti#lambda("+") echo F(3, 2) " => 5 " æ¯è¼æ¼ç®åã¨ã let F = reti#lambda("==#") echo F("homu", "mami") " => 0 echo F("mami", "mami") " => 1
ãããå©ç¨ããã¨çµã¿è¾¼ã¿é¢æ°ã§ãã sort() ã次ã®ããã«ç°¡æ½ã«æ¢è¿°ããäºãåºæ¥ã¾ãã
echo sort([3, 6, 1, 9, 2, 7, 5, 4, 8], reti#lambda("-")) " => [1, 2, 3, 4, 5, 6, 7, 8, 9]
[ã¹ã¯ãªãããã¼ã«ã«é¢æ°ã SID ä»ãã®ååã¸å¤æ]
æ¡ä»¶ä»ãã§ãããã¹ã¯ãªãããã¼ã«ã«é¢æ°ã SID ä»ãã®é¢æ°ã¸ã¨å¤æãè¡ããã¨ãåºæ¥ã¾ãã
æ¡ä»¶ã¯ã¹ã¯ãªãããã¼ã«ã«é¢æ°å
ã§ä½¿ç¨ããäºã
function! s:minus(a, b) return a:a - a:b endfunction " NG " echo reti#function("s:minus")(1, 2) function! Func() " NG " echo reti#function("s:minus")(1, 2) endfunction " ã¹ã¯ãªãããã¼ã«ã«é¢æ°ã§å¼ã³åºããå ´åãSID ä»ãã®é¢æ°åç §ã¨ãã¦è¿ã function! s:func() " OK let F = reti#lambda("s:minus") echo F " => <SNR>xxx_minus echo F(1, 2) " => -1 " ã°ãã¼ãã«é¢æ°ã®å ´å㯠function() ã¨ç価 let F = reti#lambda("Func") echo F() " => 0 endfunction call s:func() <
ããã¯ã¹ã¯ãªãããã¼ã«ã«é¢æ°ãã¹ã¯ãªããã®å¤ã§è©ä¾¡ããå ´åã«æå¹ã§ãã
ä¾ãã°ãã¹ã¯ãªãããã¼ã«ã«é¢æ°ãã³ã¼ã«ããã¯é¢æ°ã¨ãã¦æ¸¡ãããçã
ï¼ãã ããææ°çã® Vim ã§ã¯ function() ã«ã¹ã¯ãªãããã¼ã«ã«é¢æ°ã渡ããããã«ãªã£ãã¿ããã§ããï¼æªç¢ºèª
[è¾æ¸é¢æ°ãé¢æ°å]
è¾æ¸ã¨è¾æ¸é¢æ°åã渡ããå ´åããã®è¾æ¸é¢æ°ãè©ä¾¡ããé¢æ°ã®åç
§ãè¿ãã¾ãã
let s:dict = { \ "value" : 0 \} function! s:dict.count() let self.value += 1 endfunction let s:Count = reti#lambda(s:dict, "count") call s:Count() call s:Count() call s:Count() call s:Count() echo s:dict.value " => 4
ã¨ãããæã㧠reti.vim ã使ç¨ããã° Vim script ã§ãªãã¡ãã£ã¦ã©ã ãã使ããã¨ãåºæ¥ã¾ãã
å®éã®ã¨ããããã®ãã©ã°ã¤ã³åä½ã§ã¯ã¨ãã£ã¿ã¨ãã¦ä½ãããªããã§ããããã¤ãã©ã°ã¤ã³ã¨ãã¦ã¯é¢ç½ãããããªããã¨æãã¾ãã
ä»ã«ã vim-reti/example ã«ããã¤ã example ãç½®ãã¦ããã®ã§æ°ã«ãªã人ã¯è¦ã¦ã¿ãã¨ããã¨æãã¾ãã