둘 다 대부분의 객체 지향 언어처럼 비공개 함수를 선언하는 것 같아요. 동작이 다른가요, 아니면 하나가 문법 설탕일 뿐인가요?
ring 애플리케이션의 핸들러를 정의하는 코드에서 defn ^:private를 봤어요.
둘 다 대부분의 객체 지향 언어처럼 비공개 함수를 선언하는 것 같아요. 동작이 다른가요, 아니면 하나가 문법 설탕일 뿐인가요?
ring 애플리케이션의 핸들러를 정의하는 코드에서 defn ^:private를 봤어요.
Each appears to declare a private function, as in most object-oriented languages. Do they behave differently, or does one merely provide syntactic sugur?
I've encountered defn ^:private in code defining a ring application's handler function.
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).
The defn- macro simply abbreviates a "private" function declaration. Written out fully, it becomes:
(defn ^:private entry [inputs] ...)
This is really only a signal to users to avoid those functions. Bypassing this limited "private" protection for testing and similar tasks is straightforward. I avoid so-called "private" functions because of the inconvenience (occasionally I attach ^:no-doc metadata and choose names such as entry-impl to show a fn isn't within the public API and library consumers ought to disregard it).
For additional details, inspect how Clojure source code defines defn- (https://github.com/clojure/clojure/blob/38bafca9e76cd6625d8dce5fb6d16b87845c8b9d/src/clj/clojure/core.clj#L4925).
원래 질문에 답하자면 둘은 같아요.
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과 정확히 똑같이 동작해요.
To address what was asked originally: they are equivalent.
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=>
Examining the implementation of defn- shows it behaves exactly like defn after attaching :private true metadata to the name symbol.
GDScript에서 enum을 이렇게 선언했어요: 가능한 모든 변형을 나열하지 않고 enum 변형을 무작위로 고르고 싶어요. 나중에 변형을 더 추가해도 무작위로 선택하는 코드를 수정하지 않도록요. 이런 방법을 시도해 봤어요:…
Nim에서는 나머지를 어떻게 표현하나요? cell % 7 == 0를 쓰면 undeclared identifier: '%'가 나옵니다 Google로 검색해도 SO를 찾아봐도 답을 찾지 못했습니다.
함수 실행이 끝나면 어떤 값을 반환하게 하려면 어떻게 하나요? 예를 들어 이런 것이 있습니다: ROUTINE N ? N ⍴ 12 //이것은 1부터 12까지의 난수 N개를 만듭니다 (N은 함수의 인수입니다). 함수의 결과를 돌…