2010-05-31 37 views
6

Trong Đề án, làm cách nào tôi có thể sử dụng thuật toán xác định/lambda cho các biểu thức lambda lồng nhau trong định nghĩa của tôi?Đề án xác định/tốc ký lambda

Ví dụ cho các thủ tục sau đây ...

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

Người ta có thể rút ngắn nó như thế này:

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


Tuy nhiên, làm thế nào tôi có thể rút ngắn các chức năng sau đây tương tự?

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

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

Trả lời

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

Lambda thứ hai không thể được rút ngắn.

Bạn cũng có thể rút ngắn nó thành (define (makeOperator operator) operator), nếu bạn không muốn thực thi hàm trả về sẽ lấy chính xác hai đối số.

+0

Cảm ơn - Tôi sẽ +1 cho bạn sau khi đặt lại giới hạn phiếu bầu của tôi :). http://www.scheme.com/tspl2d/start.html#g1642 - nếu bạn cuộn xuống một chút, tác giả dường như đang nói về một số loại cú pháp chấm để rút ngắn định nghĩa. Có biết anh ấy đang nói gì không? – Cam

+2

@incrediman: Vâng, anh ấy đang nói về '(define (f. Xs) ...)' cho phép bạn gọi f với số lượng đối số tùy ý (ví dụ '(f 1 2 3 4 5)') và ' xs' sẽ là danh sách chứa các đối số đó. – sepp2k

+0

Ahhh. Gotcha - cảm ơn. Đó là thực sự khá hữu ích chính nó, vì vậy tôi vui vì tôi hỏi :) – Cam

4

Trái ngược với câu trả lời ở trên, thứ hai lambdathể sử dụng viết tắt define ký hiệu:

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

Nó không thực sự giống nhau. Theo cách viết đơn giản của tôi, không có biến phụ nào được khai báo, nhưng ở đây bạn đang khai báo foo. Vì vậy, trong khi nó sử dụng cú pháp xác định, nó không thực sự viết tắt. Cộng với nó dài hơn phiên bản lambda của sepp2k./kết thúc ý kiến ​​tương đối kém quan tâm – Cam

+2

(a) Tôi đã không nói rằng nó ngắn hơn - chỉ có nó sử dụng * biểu thức * 'define' mà là những gì bạn hỏi; (b) câu hỏi của bạn là liệu có thể sử dụng ký hiệu này cho một 'lambda' nội bộ - rõ ràng, điều này sẽ đi kèm với một tên phụ bởi vì đó chính xác là những gì' define' làm: không có cách nào để sử dụng nó mà không có tên. –

+0

Oh, và BTW, nếu mục tiêu của bạn chỉ là viết tắt, thì sepp2k cho biết bạn có thể sử dụng '(toán tử define (makeOperator))', và nếu bạn thực sự muốn thực hiện tất cả các cách: '(định nghĩa giá trị makeOperator)) 'gần bằng nhau. –

6

Một số triển khai của Đề án - như Guile (thử nghiệm với phiên bản 1.8) và MIT Scheme - cung cấp ký hiệu viết tắt sau:

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

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

Tôi tin rằng ký hiệu này được sử dụng khá nhiều trong Structure and Interpretation of Classical Mechanics.