vital.vim의 Data.List에 람다 식을 전달할 수 있습니다!

10222 단어 neovimVim

요약



이 PR 에 의해,
Vim script의 준 표준 라이브러리 인 vital.vim의 Data.List 모듈에서,
Funcref (람다 식 및 함수 참조)를 사용할 수 있습니다!

  • Add the supports to use Funcref and Data.Closure's {callable} in Data.List by aiya000 - Pull Request #511 - vim-kr/vital.vim - GitHub

  • Vim script로 Functional Programming을 즐기자!
    let s:L = vital#vital#new().import('Data.List')
    
    let xs = range(0, 50)
    let xs = s:L.map(xs, { x ->
        \   (x % 5 == 0) && (x % 3 == 0) ? 'FizzBuzz'
        \ : (x % 5 == 0) ? 'Fizz'
        \ : (x % 3 == 0) ? 'Buzz'
        \                : string(x)
    \ })
    
    function! s:p(x) abort
        return a:x ==# 'Fizz'
    endfunction
    
    let xs = s:L.filter(xs, function('s:p'))
    echo s:L.all(function('s:p'), xs)
    " 1
    

    배경



    Vim8.0에서 람다식이 지원되었으므로,
    Data.List가 Funcref에 해당해야 했습니다.

    이 PR 이전에는 아래와 같이,
    표현식을 나타내는 문자열만 전달할 수 있었습니다.
    이것은 Vim script의 전통적인 방법입니다.
    let s:L = vital#vital#new().import('Data.List')
    echo s:L.map(range(0, 9), 'v:val + 1')
    " [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    

    이번 추가로



    아래와 같이,
    Funcref (람다 식, 함수 참조)를 사용할 수 있습니다!
    let s:L = vital#vital#new().import('Data.List')
    
    function! s:succ(x) abort
        return a:x + 1
    endfunction
    
    " ラムダ式
    let Succ = { x -> x + 1 }
    
    " 関数参照
    let Succ_ = function('s:succ')
    
    let xs = range(0, 9)
    echo s:L.map(xs, Succ) == s:L.map(xs, Succ_)
    " 1
    

    Vim script의 오래된 전통과 함께



    Data.List.Closure



    vital.vim에는,
    Vim8.0 이전의 Vim에서도 함수 부분 적용을 위한 Data.Closure 모듈이 있습니다.

    이번 PR에서는
    Data.Closure 개체에서 Data.List의 각 함수를 사용하는 Data.List.Closure 모듈도 추가되었습니다.
    let s:V  = vital#vital#new()
    let s:C  = s:V.import('Data.Closure')
    let s:CL = s:V.import('Data.List.Closure')
    
    function! s:plus(x, y) abort
        return a:x + a:y
    endfunction
    let plus = s:C.from_funcref(function('s:plus'), [10])
    
    let xs = range(0, 9)
    echo s:CL.map(xs, plus)
    " [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
    

    Data.List.Closure는 성능에 어려움이 있기 때문에,
    Data.List내의 직접 대응은 배웅되었습니다.

    그래서 기본적으로,
    Vim8.0에서 추가된 클로저 함수(람다 식)
    또는 함수 함수를 통한 부분 적용
    와 함께 Data.List를 사용하는 것이 좋습니다.

    이상



    Vim script로 Functional Programming을 즐기자!
    Data.Optional과 Data.Either도 있습니다!

    @밀리



     실은 본 PR은 도중에 「Vim 7.4만으로 Vim script의 퍼스 에러가 일어난다」라고 하는 문제를 우연히 만나고 있어,
    하루카는 하루카에 의해 방치되어 버렸습니다.

    거기서 그 대응을 해 주신 것이 Milly씨였습니다.
    고마워요!

    유용한 페이지


  • vim-kr/vital.vim: A comprehensive Vim utility functions for Vim plugins
  • 문서
  • Data.List
  • Data.List.Closure
  • Data.Closure
  • Data.Optional
  • Data.Either

  • 좋은 웹페이지 즐겨찾기