Nim의 func(부작용 함수 없음)가 엄격해지다

8893 단어 Nimtech

개요

  • Nim에서 가장 간단한 과정 정의 방법은proc

  • 대체proc, 부작용이 없음func을 명확히 하기 위해
  • 사용 가능
  • 하지만 지금까지 Nim은 부작용이 없다는 기준이 느슨해 직감과 맞지 않는다
  • v1.4.0 이후 부작용 없는 기준을 엄격히 적용할 수 있음
  • 정보 출처


    Version 1.4.0 released
    Write Tracking for Nim (Part 2)

    지금까지의 방법

  • 간단한 프로세스 정의 예
  • proc add(a,b:int):int =
        return a + b
    
    echo add(1,2) # 3
    
  • {.noSideEffect.} 샘플링 사용이 부작용이 없음을 명확히 할 수 있음
  • proc add(a,b:int):int {.noSideEffect.}=
        return a + b
    
    echo add(1,2) # 3
    
  • proc+{.noSideEffect.}프라하의 문법당func으로 사용 가능
  • func add(a,b:int):int =
        return a + b
    
    echo add(1,2) # 3
    
  • 그러나 개체를 변경하는 참조 대상의 값은 부작용에 포함되지 않습니다.
  • # このコードは有効
    type
      Node = ref object
        data: string
    
    func setData(n:Node, newData:string) =
      n.data = newData
    
    let n0 = Node(data:"original")
    
    echo n0.data # original
    setData(n0,"changed")
    echo n0.data # changed
    

    새 사양(v1.4.0 이후)


    다음 임의의 방법에 따라 부작용이 없는 규격을 엄격히 할 수 있다
  • {.experimental: "strictFuncs".} 샘플링 사용
  • 컴파일할 때--experimental:strictFuncs 옵션 사용
  • test.nim
    # このコードはコンパイルできない
    {.experimental: "strictFuncs".}
    type
      Node = ref object
        data: string
    
    func setData(n:Node, newData:string) =
      n.data = newData
    
    var n0 = Node(data:"original")
    
    echo n0.data 
    setData(n0,"changed")
    echo n0.data 
    
  • 컴파일러 오류로 다음 메시지를 표시합니다
  • 이로써 func의 행위가 더욱 직관적이고 함수에 부작용이 없음을 명확히 할 수 있다
  • test.nim(7, 6) Error: 'setData' can have side effects
    an object reachable from 'n' is potentially mutated
    test.nim(8, 4) the mutation is here
    
  • 매개 변수에 var를 더해도 func 중의 의도적인 부작용을 허용할 수 있다
  • # このコードは有効
    {.experimental: "strictFuncs".}
    type
      Node = ref object
        data: string
    
    func setData(n:var Node, newData:string) =
      n.data = newData
    
    var n0 = Node(data:"original")
    
    echo n0.data # original
    setData(n0,"changed")
    echo n0.data # changed
    

    총결산

  • v1.4.0 이후 부작용이 없는 엄격화func를 보다 직관적으로 사용할 수 있음
  • 좋은 웹페이지 즐겨찾기