개체가 함수인지 (익명인지 여부)를 확인하는 안전한 방법을 확인하려고합니다. 분명히 그것은 여러 유형의 객체와 함께 작동elisp : 개체가 함수인지 테스트
(defun function-check (x)
(and (boundp 'x)
(if (symbolp x) (fboundp x)
(functionp x))))
: functionp
또는 fboundp
으로
내가 오류를주는 예상대로, 내가 함께 노력하고 작동하지 않습니다 어쨌든
(setq lfun (lambda() "hello"))
(function-check lfun) ; -> t
(setq nfun 'buffer-name)
(function-check nfun) ; -> t
(setq slfun '(lambda() "hello"))
(function-check slfun) ; -> t
(function-check 'not-bound) ; -> safe nil
, 내 코드를 찾고 그것을 그렇게 단순한 작업을하기에는 너무 장황하고 복잡한 것처럼 보입니다.
더 나아질 수 있습니까?
업데이트 :
요청으로, 나는 "나는 예상대로 functionp
, fboundp
지금 작동합니까"로 무슨 뜻인지 명확히.
유효한 후크를 감지한다고 가정 해 보겠습니다. 이 작동하지 않습니다
(setq var 'buffer-name)
(functionp 'var) ;nil
(fboundp 'var) ;nil
우리는 사용할 필요가 :
(functionp var) ;t
(fboundp var) ;t
를이 우리가 var
가 무효가 아닌지 확인해야 작동하지만, 그렇지 않으면 우리가 얻을 오류 :
(functionp void-var) ;Lisp-error
(fboundp void-var) ;Lisp-error
상황에 따라 추가 제어 코드 추가, 코드 컴파일 등을 의미합니다.
유효한 후크는 호출 가능한 모든 객체 일 수 있습니다 : 매크로, 함수, 람다는 유효한 후크입니다. 어쨌든 functionp
매크로 작동하지 않습니다 : 람다 식으로 작동하지 않습니다
(defmacro mac() "hello")
(functionp 'mac) ;nil
fbound
동안 :
(functionp '(lambda() t)) ;t
(functionp (lambda() t)) ;t
(fboundp '(lambda() t)) ;Lisp error
(fboundp (lambda() t)) ;Lisp error
이것은 또한 발생하면 변수에 식을 할당 :
(setq var '(lambda() t))
(functionp var) ;t
(fboundp var) ;Lisp error
하는 var
이 기호 인 경우 테스트가 필요할 수 있습니다.
내가 이해하는 것처럼, 객체를 호출 할 수있는 직접적인 방법은 없다. 그러므로 내 시도이다.
필자는 elisp를 손쉽게 사용할 수는 없지만, 이것은 끔찍한 버그처럼 보입니다. 아마도 ((또는 (functionp x) (및 (symbolp x) (fboundp x)))''를 원할 것입니다. quote'x'. 그렇다 할지라도'(funcall (lambda ....) ...)'이 elisp에서 작동하는지,'functionp'에서 그런 목록에 대해 말하는지를 잊어 버린다. – tfb
'functionp'의 문제점은 무엇입니까? 그것은 객체가 함수인지 여부를 테스트하는 함수입니다. 어떤 오류가 발생 했습니까? 'functionp'와 같은 정의를 사용하지 않는다면 어떻게 "object is a function"을 정의 할 수 있습니까? – Gilles
@Gilles 저는 여러분이 말하는 것처럼'functionp'는 아마도 대답이라고 생각합니다 : 그것은 elisp에서'(functionp 'car)'가 true 인 것처럼 보입니다 : Common Lisp에서는 false입니다. – tfb