2010-11-15 13 views
5

Yani, herhangi bir sayıdaki argümanı kabul edebilecek fonksiyonların nasıl çalıştığını görmeye çalışıyorum? Şemada isteğe bağlı argümanlar ve noktalar

Bu

(define (plus x . xs) 
    (if 
    (null? xs) x 
    (plus (+ x (car xs)) . (cdr xs)))) 
(plus 1 2 3 4) 

çalıştı Ama aslında xs cdr uygulayarak, ama ayıklayıcısında içinden basan içinde ((2 3 4)) geçen olmadığını gibiydi edilir. "Ha, ben şimdi de cdr geçmesi görmek istiyorum", ama bir hata alıyorum: Yani bu

(define (plus* x . xs) 
    (if 
    (null? xs) x 
    (let ((h (car xs)) 
     (t (crd xs)))    
    (plus* (+ x h) . t)))) 

Düşünmeyi çalıştı "uygulaması: Kötü sözdizimi (.` Arasında 'kaçak kullanım) içinde: (artı * (+ xh). t) "

Neler oluyor?

(I çalışmalara ek bir sürümünü almak ya

(define (add . xs) 
    (foldl + 0 xs)) 

Hatta

(define (plus x . xs) 
    (if 
    (null? xs) x 
    (apply plus (cons (+ x (car xs)) (cdr xs))))) 

yüzden, ilave şeyler nasıl çalıştığını noktalı sorun değil, tarafından edebilirsiniz.)

cevap

6

Son sürümünüz, sayıların listesini plus numaralı girdi olarak iletmenin doğru yoludur - siz kullanmalısınızBunu yapmak için 10. (Peki ya, ya da foldl ile yaptığınız gibi tüm şeyden kaçınmak.) Uygulamada bir nokta kullanmak gerektiğini düşündüğünüz şeyi yapmıyor - programın farklı okumasını sağlıyor.

+0

Bunun yerine ne yapar? Böyle olmayan bir nokta nasıl kullanılır? –

+3

'(x. Y)', 'x'' arabasında 'x' ile bir cons hücresi olarak okunur ve cdr’inde' y', yani doğru bir liste değildir. Benzer şekilde, '(x. (Y))' '' 'arabasında' x' olan bir konsol hücresidir ve '(y)' 'cdr'' listesinde bulunur - bu yüzden '(xy) ile aynıdır '. Yani '(artı x. (Cdr t))' yi yazdığınızda, yazdığınız (artı x cdr t) 'yi yazdığınızla aynıdır. –

+0

Not: BTW, Racket'in ikisini ayırt etmeyi mümkün kılan bir sözdizimi sistemine sahip olduğunu ve böyle bir "." Ile girilmiş bir ifadeyi ele almayı gerektirdiğini, ancak bu işlemin yapılmadığını, çünkü başka bir şekilde daha fazla karışıklığa yol açabileceğine dikkat edin. durumlar. –

İlgili konular