lset — 리스트의 원소 바꾸기

lset — 리스트의 원소 바꾸기

리스트 변수 안의 특정 원소를 새 값으로 바꾸고 싶을 때 쓰는 명령어가 lset이에요. 인덱스를 여러 개 주면 중첩된 하위 리스트 안까지 들어가 원소를 바꿔요. 바뀐 새 리스트는 변수에 저장되고, 동시에 명령어의 반환값이 되기도 해요. 주의할 점은 인덱스를 리스트 범위 밖으로 주면 오류가 난다는 거예요.

출처: 문서

본문

lset 명령어는 varName을 인수로 받는데, 이를 Tcl 리스트를 담고 있는 변수의 이름으로 해석해요. 리스트에 대한 인덱스도 0개 이상 받아요. 인덱스는 명령줄에 연속해서 줄 수도 있고, Tcl 리스트로 묶어 하나의 인수로 줄 수도 있어요. 마지막으로 varName의 한 원소에 대한 새 값을 받아요.

인덱스가 주어지지 않으면 명령어는 다음과 같은 형태가 돼요.

lset varName newValue

또는

lset varName {} newValue

이 경우 newValue가 변수 varName의 기존 값을 대체해요.

인덱스가 하나 주어지면 lset 명령어는 varName 변수의 내용을 Tcl 리스트로 취급해서 그 안의 index 번째 원소를 지정해요(0은 리스트의 첫 번째 원소). 리스트를 해석할 때 lset은 중괄호·따옴표·백슬래시에 대해 Tcl 명령 인터프리터와 같은 규칙을 따르지만, 변수 치환과 명령 치환은 일어나지 않아요. 이 명령어는 지정된 원소가 newValue로 바뀐 새 리스트를 만들고, 이 새 리스트를 변수 varName에 저장해요. 이 값은 lset 명령어의 반환값이기도 해요.

index가 음수이거나 $varName의 원소 개수보다 크면 오류가 발생해요. index$varName의 원소 개수와 같으면 주어진 원소가 리스트에 추가돼요. 각 단순 인덱스 값의 해석은 string index 명령어와 동일해서, 단순 인덱스 산술과 리스트 끝 기준 인덱스를 지원해요.

인덱스 인수가 추가로 주어지면, 각 인수는 이전 인덱싱 연산이 지정한 하위 리스트 안의 원소를 차례대로 지정해요. 덕분에 스크립트가 하위 리스트의 원소를 바꾸거나(하위 리스트에 원소를 추가) 할 수 있어요. 다음 명령어

lset a 1 2 newValue

또는

lset a {1 2} newValue

는 하위 리스트 1의 2번 원소를 newValue로 바꿔요.

각 인덱스 인수에 나타나는 정수는 0보다 크거나 같아야 하고, 해당 리스트의 길이보다 작거나 같아야 해요. 다시 말해 lset 명령어는 리스트의 크기를 오직 원소를 추가하는 방식으로만(현재 끝 다음에 놓는 방식으로) 바꿀 수 있어요. 인덱스가 허용 범위를 벗어나면 오류가 보고돼요.

구문은 다음과 같아요.

lset varName ?index ...? newValue

예시

이 예시들 각각에서 x의 초기 값은 다음과 같아요.

set x [list [list a b c] [list d e f] [list g h i]]
      → {a b c} {d e f} {g h i}

표시된 반환값은 x의 새 값이 되기도 해요(마지막 경우는 오류라서 x의 값은 그대로예요).

lset x {j k l}
      → j k l
lset x {} {j k l}
      → j k l
lset x 0 j
      → j {d e f} {g h i}
lset x 2 j
      → {a b c} {d e f} j
lset x end j
      → {a b c} {d e f} j
lset x end-1 j
      → {a b c} j {g h i}
lset x 2 1 j
      → {a b c} {d e f} {g j i}
lset x {2 1} j
      → {a b c} {d e f} {g j i}
lset x {2 3} j
      → list index out of range

다음 예시들에서 x의 초기 값은 다음과 같아요.

set x [list [list [list a b] [list c d]] \
            [list [list e f] [list g h]]]
      → {{a b} {c d}} {{e f} {g h}}

표시된 반환값도 x의 새 값이 돼요.

lset x 1 1 0 j
      → {{a b} {c d}} {{e f} {j h}}
lset x {1 1 0} j
      → {{a b} {c d}} {{e f} {j h}}

더 알아보기

  • list, lappend, lindex, linsert, llength, lsearch, lsort, lrange, lreplace, string