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.)
Bunun yerine ne yapar? Böyle olmayan bir nokta nasıl kullanılır? –
'(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. –
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. –