람다 함수

Scheme의 Lambda 함수는 익명 함수입니다. 즉, 이름이 없는 함수입니다. 이러한 함수는 인라인으로 정의되며 일반적으로 짧은 일회성 작업에 사용됩니다. lambda 구성은 함수형 프로그래밍의 강력한 도구로, 즉석에서 간결하고 유연한 논리를 생성할 수 있도록 해줍니다.

Lambda 함수는 다음과 같은 경우에 특히 유용합니다.

  • 특정하고 임시적인 목적을 위해 작은 기능이 필요합니다.
  • map, filter 또는 fold과 같은 고차 함수에 함수를 인수로 전달합니다.
  • 다른 함수에서 함수를 반환합니다.

Lambda 함수 구문

Lambda 함수는 자체적으로 정의할 수 있습니다.

(lambda (parameter1 parameter2 ...)
  body-expression)

…또는 즉시 호출됩니다.

((lambda (parameter1 parameter2 ...)
   body-expression)
 argument1 argument2 ...)
  • parameter1, parameter2, ...: 함수가 허용하는 매개변수입니다.
  • body-expression: 함수가 호출될 때 실행되는 로직입니다.
  • 즉시 호출: 두 번째 형식은 인수를 사용하여 즉시 호출되는 람다를 보여줍니다.

Lambda 함수의 예

간단한 계산을 위해 Lambda 사용

((lambda (x y) (+ x y)) 3 5)  ; 8 반환

여기:

  • 두 개의 숫자(xy)를 추가하는 람다 함수가 생성됩니다.
  • 함수는 35 인수를 사용하여 즉시 호출됩니다.

인라인 Lambda 함수

다음 예에서는 명명된 함수와 람다 함수 모두에 for-each을 사용하는 방법을 보여줍니다.

이름이 지정된 함수 사용:

(define (print-item x)
  (lumi-message (number->string x)))

(for-each print-item (list 1 2 3 4))
  • 설명:
    • print-item은 숫자를 문자열(number->string)로 변환하고 lumi-message을 사용하여 인쇄하는 명명된 함수입니다.
    • for-each(1 2 3 4) 목록의 각 요소에 print-item을 적용합니다.

출력: 1 2 3 4

Lambda 함수 사용:

동일한 논리를 람다 함수를 사용하여 인라인으로 작성할 수 있으므로 별도의 명명된 함수가 필요하지 않습니다.

(for-each (lambda (x) (lumi-message (number->string x)))
  (list 1 2 3 4))
  • 설명:
    • (lambda (x) (lumi-message (number->string x)))은 익명 함수를 정의합니다.
    • 이 기능은 for-each에 의해 (1 2 3 4) 목록의 각 요소에 적용됩니다.

출력: 1 2 3 4

인수로서의 Lambda 함수

Lambda 함수는 map 또는 filter과 같은 고차 함수에 직접 전달되는 경우가 많습니다.

숫자 목록 제곱하기

(map (lambda (x) (* x x)) '(1 2 3 4))  ; (1 4 9 16) 반환
  • lambda 함수는 목록의 각 요소를 제곱합니다.
  • map 함수는 lambda을 각 요소에 적용합니다.

반환 값으로서의 Lambda 함수

다른 함수에서 람다 함수를 반환하여 동적 동작을 생성할 수 있습니다.

덧셈 함수 생성하기

(define (make-adder n)
  (lambda (x) (+ x n)))

(define add5 (make-adder 5))
(add5 10)  ; 15 반환
  • make-adder은 특정 숫자(n)를 추가하는 새로운 람다 함수를 생성합니다.
  • 반환된 람다는 add5에 저장되며 입력에 5이 추가됩니다.

let과 함께 Lambda 사용

람다는 종종 let과 함께 사용되어 로컬 범위의 임시 함수를 생성합니다.

추가를 위한 로컬 람다

(let ((add (lambda (a b) (+ a b))))
  (add 3 4))  ; 7 반환
  • let은 람다 함수를 add 이름에 바인딩합니다.
  • 람다는 let 범위 내에서 일반 함수로 사용됩니다.

람다와 고차 함수 결합

람다는 복잡한 데이터 변환을 수행하기 위해 고차 함수와 결합될 때 빛을 발합니다.

짝수 필터링

(filter (lambda (x) (= (modulo x 2) 0)) '(1 2 3 4 5 6))  ; (2 4 6) 반환
  • lambda은 숫자가 짝수인지 확인합니다.
  • filter 함수는 람다를 사용하여 목록에서 짝수만 유지합니다.

Lambda 함수의 이점

  • 간결성: 람다는 별도의 명명된 함수를 정의할 필요성을 제거하여 상용구 코드를 줄입니다.
  • 유연성: 필요할 때마다 정의하고 사용할 수 있어 코드를 더욱 모듈화할 수 있습니다.
  • 가독성 향상: 짧은 특정 작업의 경우 람다는 추가 명명된 함수를 사용하여 코드를 복잡하게 만들지 않고 의도를 명확하게 만듭니다.

Lambda 함수를 사용해야 하는 경우

다음과 같은 경우 람다 함수를 사용하세요.

  • 논리는 짧고 독립적입니다.
  • 해당 기능은 일시적으로 또는 특정 범위 내에서만 필요합니다.
  • map, filter 또는 reduce과 같은 고차 함수로 작업하고 있습니다.

복잡한 여러 줄 논리에는 람다를 사용하지 마세요. 가독성이 떨어질 수 있습니다. 보다 광범위한 작업을 수행하려면 대신 명명된 함수를 사용하세요.

결론

Scheme의 Lambda 함수는 특정 작업에 대한 익명 함수를 정의하는 간결하고 강력한 방법을 제공합니다. 유연성과 사용 용이성은 모든 Scheme 프로그래머에게 필수적인 도구입니다. lambda을 효과적으로 사용하는 방법을 이해하면 더 깔끔하고 모듈화되며 효율적인 스크립트를 작성하는 데 도움이 됩니다.