2010-05-31 9 views
6

Scheme에서 정의 내에서 중첩 된 람다 식에 대해 define/lambda 단축형을 사용하려면 어떻게해야합니까?Scheme define/lambda shorthand

다음 절차에 주어진 예를 들어

...

(define add 
    (lambda (num1 num2) 
    (+ num1 num2))) 

하나는이로 단축 할 수 있습니다

그러나
(define (add num1 num2) 
    (+ num1 num2)) 


, 나는 유사하게 다음과 같은 기능을 단축 할 수있는 방법?

(define makeOperator 
    (lambda (operator) 
    (lambda (num1 num2) 
     (operator num1 num2)))) 

;example useage - equivalent to (* 3 4): 
((makeOperator *) 3 4) 

답변

13
(define (makeOperator operator) 
    (lambda (num1 num2) 
    (operator num1 num2))) 

제 람다 짧게 할 수 없다.

반환 된 함수가 정확히 두 개의 인수를 사용하도록 강제하지 않으려면 (define (makeOperator operator) operator)으로 줄일 수 있습니다. 위의 대답과는 달리

+0

감사합니다. 내 투표 한도가 재설정되면 +1하겠습니다. http://www.scheme.com/tspl2d/start.html#g1642 - 조금 아래로 스크롤하면 작성자는 단축 정의를위한 일종의 도트 구문에 대해 이야기하는 것처럼 보입니다. 무슨 얘길하는거야? – Cam

+2

@incrediman : 예, 그는 임의의 수의 인수 (예 :'(f 1 2 3 4 5)')로 f를 호출 할 수있게 해주는'(define (f. xs) ...) xs'는 이러한 인수를 포함하는 목록입니다. – sepp2k

+0

아. 고챠 - 고마워. 그것은 실제로 실제로 매우 유용합니다. 그래서 나는 물었습니다. – Cam

4

, 두 번째 lambda 축약 define 표기 사용할 수 있습니다 제도의

(define (makeOperator operator) 
    (define (foo num1 num2) 
    (operator num1 num2)) 
    foo) 
+1

정말 똑같은 것은 아닙니다. 필자의 간단한 약어에서는 추가 변수가 선언되지 않지만 여기에서는 foo를 선언합니다. 정의 구문을 사용하는 동안 실제로는 약식이 아닙니다. 게다가 그것은 sepp2k의 lambda 버전보다 길다./상대적으로 무식한 의견을 끝내십시오. – Cam

+2

(a) 나는 그것이 짧다는 것을 말하지 않았다 - 단지 당신이 물었던 * 속기 *'정의 '형식을 사용한다는 것; (b) 당신의 질문은 내부 람다 (lambda)에이 표기법을 사용하는 것이 가능한지 여부입니다. 분명히 이것은'define '이하는 것과 정확히 일치하기 때문에 추가 이름이 붙을 것입니다. 이름없이 사용하는 방법은 없습니다. –

+0

아, 그리고 BTW, 목표가 짧다면 sepp2k는'(define (makeOperator 연산자) 연산자)'를 사용할 수 있다고 말했고 정말로 모든 방법으로 가고 싶다면'(makeOperator 값을 정의하십시오)'는 대략 동일합니다. –

6

일부 구현 - 교활하기 추천하고 MIT 계획 (버전 1.8 테스트)를 - 제공 속기 표기법 다음

(define ((foo x) y) (+ x y)) 

(foo 5) 
; => procedure 
((foo 5) 3) 
; => 8 

나는이 표기법은 Structure and Interpretation of Classical Mechanics에 꽤 많이 사용된다 생각합니다.