2014-11-02 3 views
2

최근에 Lisp에 대해 배우기 시작했고,이 간단한 코드를 사용하여 함수를 정의하고 (defun을 사용하여) 네 요소의 배열을 만든 다음 값 7을 배열의 첫 번째 위치에 배열배열에 값을 할당하는 법을 모르겠다.

(defun func(setf array (make-array '(4)))) 
(setf (aref array 0) 7) 

출력에 FUNC를 인쇄합니다. 왜 그런가?

+2

함수 정의의 인수 목록 부분이 누락되었습니다. – Barmar

+1

어쨌든 (defun)의 출력은 항상 함수 이름입니다. 당신 (defun add() ...)을하면 ADD가됩니다. – automaton

답변

3

이 함수는 항상이 양식의 정의를 평가

(defun func() ; <- here 
    (setf array (make-array '(4))) 
    (setf (aref array 0) 7)) 

비어있는 경우에도 매개 변수 목록을 필요로하고 func라는 이름의 함수를 등록하고 등록 된 기호를 반환합니다. 그것이 바로 FUNC을 본 이유입니다. 그리고 그것은 꽤 옳고 기대됩니다. 여기 (setf array...)을 수행 할 때 array

정의되지 않습니다

다른 문제가 있습니다. 원칙적으로 모든 일이 발생할 수 있지만, 실제로는 전역 변수가 생성되고 설정 될 수 있습니다 (예 : 동적 범위의  ).

대신 로컬 변수를 만들어야합니다. 이것은 보통 let를 사용하여 수행됩니다 : 이것은 많은 일을하지 않는

(defun func() 
    (let ((array (make-array '(4)))) 
    (setf (aref array 0) 7))) 

, 반환 값은 7입니다 setf에 의해 할당 된 마지막 값이 때문이다. 그래서 당신은 전에 그 값을 설정하지 않는 한 물론, (나중에 동작을 보증되지 그들로부터 읽으려고 요소 1, 2, 3이 초기화되지

(defun func() 
    (let ((array (make-array '(4)))) 
    (setf (aref array 0) 7)) 
    array)) 

참고 : 당신은 가능성이 가장 높은 배열을 반환 할 것).

(defun func() 
    (copy-seq #(7 0 0 0))) 
: 당신이 당신 array의 정확한 구조를해야 할 경우

(defun func() 
    (let ((array (make-array 4 :fill-pointer 0))) 
    (vector-push 7 array) 
    array)) 

, 당신은 문자를 복사 할 수 있습니다 : 당신은 단지 첫 번째 요소로 채워지고 같은 배열을 치료하려면, 당신은 fill-pointer 사용할 수 있습니다

관련 문제