다른 사람들의 eLisp 코드에 날카로운 인용 부호가 사용되는 것을보고 직접 사용하지만 언제 적절하고 명확하지 않은지 명확하지 않습니다.
날카로운 따옴표를 사용하는 것이 적절한 경우와 보통의 작은 따옴표를 대신 사용해야 할 때 누구든지 정확하게 설명 할 수 있습니까?
#'
@ izkon의 질문의 사용이 아니라 적용하는 반면, (대답은 기본적으로 "결코"입니다) 람다와 #'
심볼에 적용.
다른 사람들의 eLisp 코드에 날카로운 인용 부호가 사용되는 것을보고 직접 사용하지만 언제 적절하고 명확하지 않은지 명확하지 않습니다.
날카로운 따옴표를 사용하는 것이 적절한 경우와 보통의 작은 따옴표를 대신 사용해야 할 때 누구든지 정확하게 설명 할 수 있습니까?
#'
@ izkon의 질문의 사용이 아니라 적용하는 반면, (대답은 기본적으로 "결코"입니다) 람다와 #'
심볼에 적용.
답변:
#'
에 대한 속기 function
와 마찬가지로 '
속기입니다 quote
.
바이트-컴파일러, 인터프리터 또는 휴먼 리더에게 해당 인수가 함수 (처리 된 것으로 간주 됨)로 표시하려는 모든 위치에서 사용할 수 있습니다.
예를 들어 (또는 ) 를 사용하지 않고 단순히 인용 (사용 quote
또는 '
)하는 경우 컨텍스트는 인수의 처리 방식을 결정합니다 . 예를 들어 심볼이 속성으로 만 사용되는 컨텍스트 , 즉 함수로 사용되는 컨텍스트에서는 심볼 을 인용하거나 값을 심볼로 사용하는 변수를 전달하여 심볼을 전달할 수 있습니다.#'
function
symbol-function
그러나 #'
이러한 상황에서 사용하면 코드가 더 명확 해집니다 . Emacs-Lisp 자체가 심볼이 그러한 상황에서 함수로 사용된다는 것을 이해하더라도, 코드를 이해하는 사람에게는이를 강조하는 데 도움이 될 수 있습니다.
다른 리스프에서 간단히 인용 ( '
)되거나 인용되지 않은 람다 양식의 처리는 function
( #'
)를 사용하여 인용 할 때 함수 위치에서 사용하는 것과 다를 수 있습니다 . 그러나 Emacs Lisp에는 없습니다. 이맥스 리스프에서는 (중 하나를 사용하여 인용 할 필요 '
하거나 #'
당신은 (단순히 목록으로하지) 함수로 처리하려는 람다 양식). 자동차 lambda
등 의 목록으로 만 처리하려면 따옴표로 묶으십시오 ( '
아래 예).
(elisp)에서 익명 기능 :
-특별 양식 :
function
function-object
이 특수 양식은
FUNCTION-OBJECT
평가하지 않고 반환 됩니다.이것에서,
quote
(* note Quoting : :) 과 비슷합니다 . 그러나이 함수 와 달리quote
Emacs 평가 기 및 바이트 컴파일러에 대한 참고 사항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
함수로 사용할 의도를 모르기 때문에이 목록이 함수라고 가정 할 수 없습니다 .
#'
(aka function
)는 앞에서 사용할 수 (lambda ...)
있지만 중복되어 있으므로 실제로 의미있는 유일한 곳은 에서처럼 기호 앞에 #'car
있습니다. ELisp에서, #'car
그리고 'car
주요 목적 중 하나는 의도를 문서화하는 것입니다, 그래서 거의 동일하다 (즉, 당신이 함수로이 기호를 사용하려는 것이이 코드를 읽고 누구든지로 나타냅니다). 그러나 차이점이 더 중요한 몇 가지 상황이 있습니다.
#'car
하는지 여부를 확인 car
하고, 함수를 찾지 못하면 해당 함수를 호출했을 때와 마찬가지로 경고를 표시합니다. .내부 cl-flet
및 cl-labels
단지 #'f
로컬 정의 함수를 참조 할 수 f
있기 때문에, 'f
의지는 여전히 전역 심볼을 참조 f
(그리고 어느 기능이 저장 될 수있는 symbol-function
슬롯). 예 :
(cl-flet ((car (x y) (+ x y)))
(list #'car 'car))
=>
((closure nil (x y) (+ x y)) car)