IDL 8.4에서 도입된 새로운 기능들이 여럿 있지만 그 중에서 그리 두드러지진 않으면서도 제 관심을 끈 내용이 있습니다. 오늘 소개해드릴 LAMBDA, LAMBDAP라는 함수들인데요. 처음엔 저도 이름만 보고 무슨 수학 관련 내장함수가 추가된 줄로 알았는데 그런건 아니고 전혀 다른 맥락의 기능을 제공합니다. 저도 아직 완전하게 다 파악한 상태는 아니지만, 프로그래밍을 좀 하시는 분들에겐 관심이 갈만한 내용일 것 같아 제가 아는 한도까지만 한번 소개해드리고자 합니다.
LAMBDA, LAMBDAP는 IDL에서 부프로그램의 역할을 하는 함수 및 프로시저를 좀 더 간단하고 즉각적으로 만들고 사용할 수 있는 기능을 제공합니다. 물론 약간의 제약은 존재하지만 일단 LAMBDA부터 먼저 소개해드리면, 함수 부프로그램을 아주 간단하게 사용할 수 있도록 해주는 역할을 하는데요. 예를 들어, 내가 원하는 어떤 계산을 수행하는 사용자 정의 함수가 필요하다고 할 경우, 아주 간단한 계산이라도 다음과 같은 형식으로 함수 부프로그램을 만들어야 하는 것이 기존의 방식이었습니다.
FUNCTION mycalc, x
result = 10*x^2+20
RETURN, result
END
이렇게 만들어놓고 주프로그램에서는 PRINT, mycalc(3)과 같은 방식으로 사용을 하는 것이 통상적인 방식이었는데요. LAMBDA라는 기능을 활용하면 이 작업을 다음과 같이 간단하게 수행할 수 있습니다.
mycalc = LAMBDA(x : 10*x^2+20)
PRINT, mycalc(3)
즉, 부프로그램을 별도로 적어주지 않고 LAMBDA라는 함수내에 '인수:계산식'과 같은 형식의 문구만 넣어준 다음 그것을 내가 원하는 함수명에 대입만 시켜주면, 그러한 내장함수가 생긴 것과 마찬가지로 활용이 가능하단 얘기입니다. IDL 도움말에서 LAMBDA에 관한 설명을 보면 'creates small, inline functions'라고 되어 있는데, '작은 한 줄짜리 함수를 생성해준다'는 의미입니다. 여기서 주의할 점은 "한 줄 짜리" 내용으로 된 함수만 생성이 가능하다는 점입니다. 즉, 여러 줄로 구성되어야 하는 복잡한 내용의 함수는 여전히 전통적인 방식의 함수 부프로그램의 형식으로 만들어야 합니다. 하지만, 내용이 간단한 사용자 정의 함수의 경우는 LAMBDA를 사용하면 매우 간편하게 생성 및 활용이 가능하다는 것은 분명 장점이 됩니다.
그리고 LAMBDA를 활용할 때 반드시 주의해야 할 점이 있는데요. 이 기능을 사용하기 이전에 다음과 같은 일종의 환경선언문을 먼저 실행해야 합니다.
COMPILE_OPT strictarr
그래서 위의 내용이 온전하게 실행되려면 실제로는 다음과 같은 순서가 되어야 맞습니다.
COMPILE_OPT strictarr
mycalc = LAMBDA(x : 10*x^2+20)
PRINT, mycalc(3)
그러면 저 COMPILE_OPT로 시작하는 문구의 의미는 무엇일까요? 뒷 부분에 strictarr이란 문구가 있습니다. 이 내용의 의미는 이제부터는 IDL에서 ()는 무조건 함수의 인자를 받는 역할만 하는 것으로 간주하라는 의미입니다. 왜 이런 것이 필요하냐면, 원래 IDL에서는 ()는 배열 인덱싱에서도 사용이 가능합니다. 물론 []도 마찬가지입니다. 즉, 별도의 설정이 없다면 IDL에서는 (), [] 모두 배열 인덱싱에 사용이 가능합니다. 하지만 이 경우 ()는 배열 인덱싱 및 함수 인자 수용의 두가지 역할을 동시에 할 수 있는데, 위와 같은 문구를 사용하게 되면 이제부터는 ()는 배열 인덱싱이 아닌 무조건 함수 인자 수용의 역할만 하는 것으로 선언한다는 의미가 됩니다. LAMBDA가 제 역할을 하려면 이러한 선언이 필수이기 때문에 굳이 저런 좀 낯설어보이는 문구를 사용한다고마 보시면 됩니다. 사실 COMPILE_OPT라는 놈은 세계 유수의 IDL 프로그래머들 사이에서는 꽤 자주 쓰이는 명령이라 그 내막에 대해서 알아두는 것도 괜찮은데요. 기회가 되면 이와 관련된 내용도 조만간 한번 다뤄보기로 하겠습니다.
그리고 LAMBDA는 여러 개의 인자를 받는 함수를 만드는 것도 가능합니다. 다음은 그러한 예입니다.
COMPILE_OPT strictarr
lam = LAMBDA(a, b : SQRT(a^2+b^2))
PRINT, lam(3, 4)
이 경우는 a, b 두 인자를 받아서 제곱들의 합에 대한 제곱근을 구하는 경우인데요. 결과는 5라는 값으로 얻어집니다. 어쨌든 이와 같이 LAMBDA를 사용하면 간단하게 사용 가능한 함수 부프로그램을 생성할 수 있다는 장점이 있습니다. 물론 8.4 버전에서 새로 도입된 기능이기 때문에 그 이전 버전들과는 호환이 안됩니다. 따라서 혹시나 이전 버전의 IDL과의 호환성이 중요한 경우에는 여전히 예전의 전통적인 방식을 계속 사용해야 합니다. 그리고 여러 줄에 걸친 내용이 들어갈 수 밖에 없는 경우도 마찬가지라는 점은 염두에 둬야 하겠습니다.
오늘은 8.4버전의 신기능인 LAMBDA에 관해서 살펴봤습니다. LAMBDAP에 대해서는 곧 이어질 게시물에서 언급을 드리기로 하겠습니다.
'IDL > Programming' 카테고리의 다른 글
| WHERE 함수의 결과가 -1일 경우의 유의사항 (0) | 2015.06.08 |
|---|---|
| LAMBDA, LAMBDAP 함수 소개 [2] (0) | 2015.02.04 |
| 새로운 배열 생성 방법 소개 (0) | 2015.01.30 |
| WHERE 함수의 결과가 단 하나일 경우의 유의사항 (0) | 2015.01.05 |
| 특정 년, 월의 일수(number of days) 산출법 (0) | 2014.10.17 |