최근에 Lisp에 대해 배우기 시작했고,이 간단한 코드를 사용하여 함수를 정의하고 (defun을 사용하여) 네 요소의 배열을 만든 다음 값 7을 배열의 첫 번째 위치에 배열배열에 값을 할당하는 법을 모르겠다.
(defun func(setf array (make-array '(4))))
(setf (aref array 0) 7)
출력에 FUNC를 인쇄합니다. 왜 그런가?
최근에 Lisp에 대해 배우기 시작했고,이 간단한 코드를 사용하여 함수를 정의하고 (defun을 사용하여) 네 요소의 배열을 만든 다음 값 7을 배열의 첫 번째 위치에 배열배열에 값을 할당하는 법을 모르겠다.
(defun func(setf array (make-array '(4))))
(setf (aref array 0) 7)
출력에 FUNC를 인쇄합니다. 왜 그런가?
이 함수는 항상이 양식의 정의를 평가
(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
사용할 수 있습니다
함수 정의의 인수 목록 부분이 누락되었습니다. – Barmar
어쨌든 (defun)의 출력은 항상 함수 이름입니다. 당신 (defun add() ...)을하면 ADD가됩니다. – automaton