내가이 일을해야한다고 생각 - 배열이 참 시퀀스입니다.
(let* ((an-array (make-array 6 :initial-contents '(#\f #\o #\o #\b #\a #\r)))
(f-pos (position #\f an-array))
(r-pos (position #\r an-array)))
(rotatef (elt an-array f-pos)
(elt an-array r-pos))
an-array)
;=> #(#\r #\o #\o #\b #\a #\f)
물론 위치를 이름에 바인딩 할 필요는 없습니다. 이 역시 작동합니다 : 문제가 position
는 당신이 필요로하는 요소를 찾지 못하는 함께
(let ((an-array (make-array 6 :initial-contents '(#\f #\o #\o #\b #\a #\r))))
(rotatef (elt an-array (position #\f an-array))
(elt an-array (position #\r an-array)))
an-array)
;=> #(#\r #\o #\o #\b #\a #\f)
경우, 그 :test
인수는 도움이 될 수 있습니다. 또한 요소를 식별하기위한 자체 술어를 제공 할 수있는 position-if
및 position-if-not
함수가 있습니다. 세 가지 모두 HyperSpec에 here으로 설명되어 있습니다. 여기
아마
:test
인수와 함께 모든 시퀀스 기능
eql
인 (기본 때문에,
:test
인수없이 작동하지 않습니다 예입니다 - 표준 시퀀스 기능 키워드 인수의 좋은 요약 테이블 11-2
here 참조) 목록에 작동하지 않습니다.
(let ((an-array (make-array 3 :initial-contents '((1 2 3)
(4 5 6)
(7 8 9)))))
(rotatef (elt an-array (position '(1 2 3) an-array :test #'equal))
(elt an-array (position '(7 8 9) an-array :test #'equal)))
an-array)
;=> ((7 8 9) (4 5 6) (1 2 3))
(SBCL 1.0.55.0.debian에서 테스트 됨).
추가 :
는 여기에 2 차원 배열로 할 수있는 무력 방법입니다. find-position
은 배열의 크기가 (3 3)
이라고 가정하지만 약간 더 일반적으로 만들 수 있습니다.
내가 최고의 솔루션이를 옹호하지 않습니다,하지만 난 당신의 질문을 :) 오해 후에 당신에게 빈손를 마칠 수있었습니다
(defvar an-array #2A((1 2 3) (4 5 6) (7 8 9)))
(defun find-position (array item &key (test #'eql))
(loop for i below 3 do
(loop for j below 3 do
(when (funcall test (aref array i j) item)
(return-from find-position (list i j))))))
(defun swap-4-and-7 (array)
;; Example use
(destructuring-bind (i1 j1) (find-position array 4)
(destructuring-bind (i2 j2) (find-position array 7)
(rotatef (aref array i1 j1)
(aref array i2 j2))))
array)
(swap-4-and-7 an-array)
;=> #2A((1 2 3) (7 5 6) (4 8 9))
출처
2014-03-24 22:42:11
jbm
make-array '(3 3)와 make-array 3의 차이점은 무엇입니까? make-array'(3 3)를 통과 했으므로 위치를 시도 할 때 시퀀스가 아닌 것을 말합니다 숫자와 nil을 가진 2 차원 NxN 배열을 받고 nil을 찾고 싶습니다. 마지막 예제에서 위치는 2와 같이 목록 안의 숫자가 아닌 목록을 검색하기 때문에 작동합니다. 그리고 처음 두 예제에서 두 시퀀스는 시퀀스로 간주되어 위치 연산을하는 벡터입니다. 그러나 2 차원이면 synt array lisp는 그것이 비 시퀀스라고 생각한다 – d0pe
실제로, 사실이다. 당신이 2 차원 배열로 작업하고 있다는 것을 깨닫지 못했습니다. 질문에 좀 더 명시 적으로 추가하고 싶을 수도 있습니다. Rainer가 이해 한 것처럼 보일 수도 있습니다. – jbm
@ d0pe, 2 차원 배열에서 작동하는 무차별 대입 방식을 추가했습니다. Rainer에 대한 당신의 의견에 생각했습니다.) CL에서 다차원 배열로 작업 할 기회가 없었으므로 더 나은 방법이 될 수 있습니다. Rainer의 제안을 계속 살펴볼 것을 권합니다. – jbm