2011-02-07 2 views
1

PRINT 함수를 참조하기 위해 # 'PRINT를 사용하여 함수를 참조 할 수 있다는 것을 알고 있습니다. 첫 번째 요소가 'PRINT'인 목록 S가있는 경우 # (car S)를 사용하여 이것을 참조 할 수 있습니까?런타임시 이름으로 함수 호출

말 목록의 요소가 일부 기능의 이름 인 아톰 인 목록을보고 있습니다. 현재,이 작업을 수행 할 수

(defun aritheval (S) 
    (funcall 
     (cond 
      ((eq '+ (car S)) #'+) 
      ((eq '- (car S)) #'-) 
      ((eq '* (car S)) #'*) 
      ((eq '/ (car S)) #'/) 
     ) 
     '2 
     '3 
    ) 
) 

이 함수는 2 + 3, 2-3,리스트 S. S의 첫 번째 요소에 따라 2 * 3 2/3 이러한 함수의 이름을 포함 계산할 것이다.

답변

6

# (자동차 S)는 의미가 없습니다. 구문은 존재하지만 기호 CAR 갖는 벡터를 의미하며, S.

사용

(funcall (first somelist) someargument) 

또는

(apply (first somelist) a-list-of-arguments) 

함수 비 Lisp 다운 포맷이다.

적절한 Lisp 코드에는 후행 괄호가 사용되지 않습니다. 당신은 또한 숫자를 인용 할 필요가 없습니다. 숫자는 자기 평가이며, 스스로 평가합니다. 또한 우리는 현재 CDR보다 CAR 및 REST보다 FIRST를 선호 할 수 있습니다. 함수는 동일하지만 이름이 더 좋습니다. 간단한 목록을 다룰 때마다 FIRST, SECOND, THIRD, ... 및 REST가 사용됩니다.

(defun aritheval (S) 
    (funcall (cond ((eq '+ (car S)) #'+) 
       ((eq '- (car S)) #'-) 
       ((eq '* (car S)) #'*) 
       ((eq '/ (car S)) #'/)) 
      2 3))) 

기호는 전역 함수의 이름으로 사용할 수 있으므로 위에서는 필요하지 않습니다.

아래의이 기능은 심볼에서 기능으로의 매핑이 동일하기 때문에 동일합니다.

(defun aritheval (s) 
    (funcall (first s) 2 3))) 
+0

기능 이름이 목록에 저장되는 기능을 어떻게 참조합니까? S가 (setq S '(PRINT RESTORE))에 의해 정의되었다고합시다. –

+1

'apply'와'funcall' 둘 다 [function designator]를 취합니다 (http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_f .htm # function_designator). 따라서 함수 정의와 관련된 심볼은 유효한 인수입니다. 또한,'setq'는 아무것도 정의하지 않고 단지 기존 바인딩만을 설정합니다. 'defparameter' 또는'defvar'를 사용하여 전역 변수를 정의하십시오. – Ramarren