날카로운 따옴표는 언제 사용해야합니까?


10

다른 사람들의 eLisp 코드에 날카로운 인용 부호가 사용되는 것을보고 직접 사용하지만 언제 적절하고 명확하지 않은지 명확하지 않습니다.

날카로운 따옴표를 사용하는 것이 적절한 경우와 보통의 작은 따옴표를 대신 사용해야 할 때 누구든지 정확하게 설명 할 수 있습니까?


3
nb이 질문에 대한 여기 또는 SO에 대한 많은 복제본이 있습니다
Phils


1
나는 그것이 중복 생각하지 않습니다 : emacs.stackexchange.com/questions/3595은 사용에 관한 것입니다 #'@ izkon의 질문의 사용이 아니라 적용하는 반면, (대답은 기본적으로 "결코"입니다) 람다와 #'심볼에 적용.
Stefan

답변:


12

#'에 대한 속기 function와 마찬가지로 '속기입니다 quote.

바이트-컴파일러, 인터프리터 또는 휴먼 리더에게 해당 인수가 함수 (처리 된 것으로 간주 됨)로 표시하려는 모든 위치에서 사용할 수 있습니다.

예를 들어 (또는 ) 를 사용하지 않고 단순히 인용 (사용 quote또는 ')하는 경우 컨텍스트는 인수의 처리 방식을 결정합니다 . 예를 들어 심볼이 속성으로 만 사용되는 컨텍스트 , 즉 함수로 사용되는 컨텍스트에서는 심볼 을 인용하거나 값을 심볼로 사용하는 변수를 전달하여 심볼을 전달할 수 있습니다.#'functionsymbol-function

그러나 #'이러한 상황에서 사용하면 코드가 더 명확 해집니다 . Emacs-Lisp 자체가 심볼이 그러한 상황에서 함수로 사용된다는 것을 이해하더라도, 코드를 이해하는 사람에게는이를 강조하는 데 도움이 될 수 있습니다.

다른 리스프에서 간단히 인용 ( ')되거나 인용되지 않은 람다 양식의 처리는 function( #')를 사용하여 인용 할 때 함수 위치에서 사용하는 것과 다를 수 있습니다 . 그러나 Emacs Lisp에는 없습니다. 이맥스 리스프에서는 (중 하나를 사용하여 인용 할 필요 '하거나 #'당신은 (단순히 목록으로하지) 함수로 처리하려는 람다 양식). 자동차 lambda등 의 목록으로 만 처리하려면 따옴표로 묶으십시오 ( '아래 예).

(elisp)에서 익명 기능 :

-특별 양식 : function function-object

이 특수 양식은 FUNCTION-OBJECT평가하지 않고 반환 됩니다.

이것에서, quote(* note Quoting : :) 과 비슷합니다 . 그러나이 함수 와 달리 quoteEmacs 평가 기 및 바이트 컴파일러에 대한 참고 사항 FUNCTION-OBJECT으로 사용됩니다. FUNCTION-OBJECT유효한 람다식이 라고 가정하면 두 가지 효과가 있습니다.

• 코드가 바이트 컴파일되면 FUNCTION-OBJECT바이트 코드 함수 객체 (* note Byte Compilation : :)로 컴파일됩니다.

• 어휘 바인딩이 활성화되면 FUNCTION-OBJECT클로저로 변환됩니다. *주의 마감 ::.

읽기 구문 #'은을 사용하는 축약 형 function입니다. 다음 형식은 모두 동일합니다.

(lambda (x) (* x x))
(function (lambda (x) (* x x)))
#'(lambda (x) (* x x))

다음 예제에서는 change-property함수를 세 번째 인수 double-property 로 사용 하는 함수 change-property와 익명 함수를 전달하여 사용 하는 함수를 정의합니다.

(defun change-property (symbol prop function)
   (let ((value (get symbol prop)))
     (put symbol prop (funcall function value))))

(defun double-property (symbol prop)
   (change-property symbol prop (lambda (x) (* 2 x))))

우리는 lambda양식을 인용하지 않습니다 .

위 코드를 컴파일하면 익명 함수도 컴파일됩니다. 예를 들어, 익명 함수를 목록으로 인용하여 구성한 경우에는 발생하지 않습니다.

(defun double-property (symbol prop)
   (change-property symbol prop '(lambda (x) (* 2 x))))

이 경우 익명 함수는 컴파일 된 코드에서 람다 식으로 유지됩니다. 바이트-컴파일러는이 목록이 하나의 함수처럼 보이지만 change-property함수로 사용할 의도를 모르기 때문에이 목록이 함수라고 가정 할 수 없습니다 .


9

#'(aka function)는 앞에서 사용할 수 (lambda ...)있지만 중복되어 있으므로 실제로 의미있는 유일한 곳은 에서처럼 기호 앞에 #'car있습니다. ELisp에서, #'car그리고 'car주요 목적 중 하나는 의도를 문서화하는 것입니다, 그래서 거의 동일하다 (즉, 당신이 함수로이 기호를 사용하려는 것이이 코드를 읽고 누구든지로 나타냅니다). 그러나 차이점이 더 중요한 몇 가지 상황이 있습니다.

  • 바이트-컴파일러는이 문서화 된 의도를 이용하며, 작성할 때 함수로 존재 #'car하는지 여부를 확인 car하고, 함수를 찾지 못하면 해당 함수를 호출했을 때와 마찬가지로 경고를 표시합니다. .
  • 내부 cl-fletcl-labels단지 #'f로컬 정의 함수를 참조 할 수 f있기 때문에, 'f의지는 여전히 전역 심볼을 참조 f(그리고 어느 기능이 저장 될 수있는 symbol-function슬롯). 예 :

    (cl-flet ((car (x y) (+ x y)))
      (list #'car 'car))
    =>
    ((closure nil (x y) (+ x y)) car)
    
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.