2010-05-31 35 views
6

Şemada, tanımlamamda iç içe geçmiş lambda ifadeleri için define/lambda shorthand işlevinden nasıl yararlanabilirim?Şema tanımlaması/kısa açıklama

Aşağıdaki prosedür Verilen örnek için

...

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

biri bu kadar kısaltın edebilirsiniz:

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


, ben benzer aşağıdaki işlevi kısaltmak nasıl?

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

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

cevap

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

ikinci lambda kısaltılmış edilemez.

Döndürülen işlevin tam olarak iki argüman almasını zorunlu kılmak istemiyorsanız, (define (makeOperator operator) operator) adresine kısaltabilirsiniz. Yukarıdaki yanıt aksine

+0

Teşekkürler - Oylama limiti sıfırlandıktan sonra + 1'leyeceğim :). http://www.scheme.com/tspl2d/start.html#g1642 - biraz aşağı kaydırırsanız, yazar tanımları kısaltmak için bir tür nokta sözdizimi hakkında konuşuyor gibi görünüyor. Ne hakkında konuştuğunu biliyor musun? – Cam

+2

@incrediman: Evet, o (arg (f. Xs) ...) 'den bahsetmektedir, ki bu da keyfi argüman sayısıyla f'yi aramanıza izin verecektir (örn. (F 1 2 3 4 5)') ve ' xs, bu argümanları içeren bir liste olacaktır. – sepp2k

+0

Ahhh. Gotcha - teşekkürler. Bu aslında oldukça yararlı, bu yüzden ben sordum :) – Cam

4

, ikinci lambda kestirme define notasyon kullanılabilir: Şema

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

Bu gerçekten aynı şey değil. Daha basit kısayolumda, fazladan değişken bildirilmiyor, ancak burada foo ilan ediyorsun. Yani tanım sözdizimini kullanırken, bu gerçekten kestirme değildir. Artı sepp2k tarafından lambda sürümünden daha uzun./göreceli olarak görülemeyen bir görüş – Cam

+2

(a) Daha kısa olduğunu söylemedim - sadece ne diye sorduğun * shorthand * 'define' formunu kullanır; (b) Sorunuz, bu gösterimi dahili bir lambda için kullanmanın mümkün olup olmadığıydı - açıkçası, bu ekstra bir isimle ortaya çıkacaktır çünkü bu tam olarak tanımlamaktır: bir isim olmadan onu kullanmanın bir yolu yoktur. –

+0

Oh ve BTW, eğer hedefiniz sadece kısa yapmaksa, o zaman sepp2k dediğiniz gibi ((make (operatör) operatörü)) işlevini kullanabileceğinizi ve eğer gerçekten tüm yolu kullanmak istiyorsanız: '(makeOperator değerlerini tanımlayın) 'kabaca aynıdır. –

6

bazı uygulamaları - Guile'ın gibi MIT Şema (sürüm 1.8 ile test edilmiştir) - sağlamak steno ifadenin ardından:

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

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

bu notasyonu Structure and Interpretation of Classical Mechanics oldukça çok kullanılır inanıyoruz.