Programming 언어/Skill

[SKILL 강좌] geGetSelSet() 함수와 foreach 문

호드맨 2017. 2. 5. 12:49

이번에 알아볼 녀석은 geGetSelSet() 함수입니다. Finder에서 함수 description은 이렇군요.

 

geGetSelSet(  
   [ w_windowId ] 
   [ d_cellview ]  
 ) 
     => l_selectedSet / nil 


Returns a list of the currently selected objects in a window or cellview.

네, 선택된 object 들을 list로 반환해 주는 함수입니다. 이전에 응용하기 change_bracket 편에서는 cellView에 있는 모든 shape에서 동작시켰는데요. 이러한 경우도 있지만 실제로는 "선택된 녀석들만.." 실행하고 싶을 경우가 있습니다. 이러한 경우 사용되는 함수죠.

geGetSelSet() 함수와 같이 사용하기 편한 함수가 있습니다. foreach죠. 몇 개의 값이 들어있는지 모르는 list에 대한 함수를 짤 때 유용합니다. 자세한 설명보다는 예제로.. 몇 개인지 모르는 list에 대해서 각 변수를 print 하는 함수입니다. 처음엔 for문을 이용해보겠습니다.

 

a_list = list("aaa" "bbb" "ccc" "ddd" .... (몇개인지 모름) ... "zzz")

for(i 0 length(a_list)-1
   printf("%s\n", nth(i a_list)) 
) 

aaa 
bbb 
ccc 
ddd 
eee 
zzz 
t

list의 길이를 모르기 때문에 length 함수를 통해 개수를 구한 뒤 다시 nth() 함수를 통해 그 리스트의 몇 번째 변수인지 구해야 합니다. foreach 문을 이용하면 간단히 이렇게..

 

foreach(value a_list 
   printf("%s\n", value) 
) 

aaa 
bbb 
ccc 
ddd 
eee 
zzz 
t 

foreach문의 두 번째 인수로 list를 받아서 그 list의 각 값을 value라 이름을 주어서 printf 함수를 실행하게 됩니다. 모든 값에 대해서 실행하므로 for문과 같지만 좀 더 간단하죠? 기존에 change_bracket 편에서 작성한 함수를

 

foreach(shape geGetSelSet() 
   label = shape->theLabel 
   
   rexCompile("<") 
   label = rexReplace(label "[" 0) 
   
   rexCompile(">") 
   label = rexReplace(label "]" 0) 
   
   shape->theLabel = label 
)

이렇게 바꿔주면 선택된 녀석들에서만 실행하게 됩니다. 앞에서 작성한 것과 비교하면서 보시면 이해가 편할 겁니다.

SKILL을 작성하다 보면 선택된 녀석을~ 어찌어찌 ~하겠다. 는 경우가 많기 때문에 foreach(name geGetSelSet()... 구문은 사용될 일이 많은 겁니다. 간단한 거니 몇 번씩 쓰다 보면 어렵지 않게 쓰실 수 있을 겁니다. 뭐 굳이 어렵다면 for문을 사용해도 차이점은 없습니다. 다음에는 via 관련된 내용을 좀 다룰까 합니다.