적용 및 funcall - 다른 결과
-
21-12-2019 - |
문제
ANSI 공통 Lisp.마지막 경우에 다른 답변을 얻는 이유는 무엇입니까?
(list 1 2 3 nil) ; (1 2 3 nil)
(funcall (function list) 1 2 3 nil) ; (1 2 3 nil)
(apply (function list) '(1 2 3 nil)) ; (1 2 3 nil)
(apply (function list) 1 2 3 nil) ; (1 2 3)
해결책
APPLY
인수로 기대합니다 :
- 함수
- 영 ...n개의 인수
- 그런 다음 끝에 인수 목록이 있습니다.
함수는 기본적으로 다음의 결과로 호출됩니다. (list* 0-arg ... n-arg argument-list)
참고하세요 (list* '(1 2 3))
그냥 평가한다 (1 2 3)
.
인수는 다음과 같습니다. 확산 가능한 인수 목록 커먼리스프에서.
CL-USER 60 > (apply (function list) 1 2 3 nil)
(1 2 3)
CL-USER 61 > (apply (function list) (list* 1 2 3 nil))
(1 2 3)
CL-USER 62 > (apply (function list) (list* '(1 2 3)))
(1 2 3)
APPLY
의도적으로 이러한 확산 가능한 인수 목록을 사용합니다.예를 들어 (... 1 2 3 '(4 5))
.와 함께 FUNCALL
평소대로 인수를 작성해야 합니다. (... 1 2 3 4 5)
.
APPLY
Common Lisp에는 단일 목적이 있습니다.계산된 인수 목록을 사용하여 함수를 호출할 수 있습니다.이를 좀 더 편리하게 만들기 위해 확산 가능한 인수 목록이라는 아이디어가 사용되었습니다.예를 들어 Emacs Lisp에서도 동일하게 작동합니다.
인수 목록이 있고 앞에 인수 두 개를 추가한다고 가정해 보세요.
CL-USER 64 > (apply '+ args)
60
CL-USER 65 > (apply '+ 1 2 args)
63
CL-USER 66 > (apply '+ (append (list 1 2) args))
63
제휴하지 않습니다 StackOverflow