2013-01-13 3 views
3

2 개 Scheme 기능 정의 체계의 기능 차이

; Define function 
(define (square n) (* n n)) 
(square 12) 
144 

; Another way to define same function 
(define square (lambda (n) (* n n))) 
(square 12) 
144 

이 고려해이다는 동일한 결과를 보인다.

이러한 함수 선언간에 기능상의 차이점이 있습니까? 어떤 상황에서는 다른 사람보다 선호해야합니까?

답변

4

두 정의 사이에는 차이가 없습니다. 전자는 후자에 대한 구문 설탕입니다.

선호하는 스타일은 스타일에 관한 문제이지만, 일반적으로 이전 정의는 다소 간결하고 어쩌면 더 읽기 쉽기 때문에 일반적으로 선호하는 기능 정의 방법입니다.

소개 텍스트는 종종 명명 된 함수가 람다를 포함하는 변수라는 것을 분명히하기 위해 후자를 사용합니다. 첫 번째 변형을 사용할 때 분명하지 않은 것이 있습니다.

+1

실제로! 처음 선언 할 때 먼저 함수 선언으로 이해했습니다. λ가 들어있는 변수 선언이라는 생각은 나에게는 일어나지 않았다. 고맙습니다. – JAM

1

sepp2k는 정의한 두 절차가 동일하다는 점에서 절대적으로 맞습니다. 이와 같은 간단한 프로 시저 정의에서 올바른 것이고 우선 순위의 문제로 귀결됩니다.

명시적인 lambda 문을 사용하는 것이 의미있는 한 가지 경우는 절차의 상태를 추적해야하는 경우입니다. 예를 들어 다음과 같은 카운터를 만들 수 있습니다.

(define counter 
    (let ((count 0)) 
     (lambda() 
      (set! count (+ count 1)) 
      count))) 

(counter) ;=> 1 
(counter) ;=> 2 
(counter) ;=> 3