openlang

Clojure에서 defn-와 ^:private 함수 선언은 다른가요?

둘 다 대부분의 객체 지향 언어처럼 비공개 함수를 선언하는 것 같아요. 동작이 다른가요, 아니면 하나가 문법 설탕일 뿐인가요?

ring 애플리케이션의 핸들러를 정의하는 코드에서 defn ^:private를 봤어요.

영어에서 번역원문 보기

이어지는 대화 2

서로의 근거를 따라
  1. 고유 링크

    defn- 매크로는 "비공개" 함수 선언의 축약형일 뿐이에요. 길게 쓰면 이렇게 돼요:

    
    (defn ^:private entry [inputs] ...)

    실제로는 그 함수를 사용하지 말라는 신호일 뿐이에요. 테스트 같은 용도로 이 제한적인 "비공개" 보호를 우회하는 건 간단해요. 번거로워서 저는 소위 "비공개" 함수를 쓰지 않아요(가끔 ^:no-doc 메타데이터를 붙이거나 entry-impl 같은 이름을 써서 공개 API에 속하지 않는 fn이므로 라이브러리 사용자가 무시해야 한다고 표시해요).

    더 자세한 내용은 Clojure 소스에서 defn-를 정의하는 부분을 보세요 (https://github.com/clojure/clojure/blob/38bafca9e76cd6625d8dce5fb6d16b87845c8b9d/src/clj/clojure/core.clj#L4925).

    영어에서 번역원문 보기
  2. 고유 링크

    원래 질문에 답하자면 둘은 같아요.

    
    user=> (defn- first_fn [value] value)
    #'user/first_fn
    user=> (defn ^:private second_fn [value] value)
    #'user/second_fn
    user=> (meta #'first_fn)
    {:private true, :arglists ([value]), :line 1, :column 1, :file "NO_SOURCE_PATH", :name first_fn, :ns #object[clojure.lang.Namespace 0xcaf2cc4 "user"]}
    user=> (meta #'second_fn)
    {:private true, :arglists ([value]), :line 1, :column 1, :file "NO_SOURCE_PATH", :name second_fn, :ns #object[clojure.lang.Namespace 0xcaf2cc4 "user"]}
    user=> (source defn-)
    (defmacro defn-
      "same as defn, yielding non-public def"
      {:added "1.0"}
      [name & decls]
        (list* `defn (with-meta name (assoc (meta name) :private true)) decls))
    nil
    user=>

    defn- 구현을 보면 name 심벌에 :private true 메타데이터를 붙인 defn과 정확히 똑같이 동작해요.

    영어에서 번역원문 보기

같은 질문의 다른 갈래

  1. Godot 3.3의 GDScript에서 일일이 나열하지 않고 enum 항목을 무작위로 고르기?

    GDScript에서 enum을 이렇게 선언했어요: 가능한 모든 변형을 나열하지 않고 enum 변형을 무작위로 고르고 싶어요. 나중에 변형을 더 추가해도 무작위로 선택하는 코드를 수정하지 않도록요. 이런 방법을 시도해 봤어요:…

    답글 2최근 활동 gdscript
  2. Nim 나머지 연산 문법

    Nim에서는 나머지를 어떻게 표현하나요? cell % 7 == 0를 쓰면 undeclared identifier: '%'가 나옵니다 Google로 검색해도 SO를 찾아봐도 답을 찾지 못했습니다.

    답글 2최근 활동 nim
  3. APL 함수에서 결과 반환하기

    함수 실행이 끝나면 어떤 값을 반환하게 하려면 어떻게 하나요? 예를 들어 이런 것이 있습니다: ROUTINE N ? N ⍴ 12 //이것은 1부터 12까지의 난수 N개를 만듭니다 (N은 함수의 인수입니다). 함수의 결과를 돌…

    답글 2최근 활동 apl