Vì vậy, tôi đang cố gắng xem các hàm có thể chấp nhận bất kỳ số đối số nào hoạt động?Đối số và dấu chấm tùy chọn trong lược đồ
Tôi cố gắng này
(define (plus x . xs)
(if
(null? xs) x
(plus (+ x (car xs)) . (cdr xs))))
(plus 1 2 3 4)
Nhưng dường như là nó đã không thực sự áp dụng cdr để xs, nhưng đi qua ((2 3 4)) trong khi tôi bước qua nó trong trình gỡ lỗi. Vì vậy, tôi đã cố gắng
(define (plus* x . xs)
(if
(null? xs) x
(let ((h (car xs))
(t (crd xs)))
(plus* (+ x h) . t))))
tư duy này: "ha, tôi muốn xem bạn vượt qua cdr ở ngay bây giờ", nhưng tôi nhận được một lỗi: "Ứng dụng: cú pháp xấu (. Sử dụng trái phép` ') tại: (cộng * (+ xh). t) "
Điều gì đang xảy ra?
(Tôi có thể nhận được một phiên bản bổ sung cho công việc, hoặc bằng cách
(define (add . xs)
(foldl + 0 xs))
Hoặc thậm chí
(define (plus x . xs)
(if
(null? xs) x
(apply plus (cons (+ x (car xs)) (cdr xs)))))
vậy, việc bổ sung không phải là vấn đề, làm thế nào chấm mọi thứ làm việc được.)
Thay vào đó, nó sẽ làm gì? Làm thế nào người ta sử dụng dấu chấm, nếu không như vậy? –
'(x. Y)' được đọc dưới dạng ô đối chiếu có 'x' trong' ô' và 'y' trong cdr của nó - nghĩa là, nó không phải là danh sách thích hợp. Tương tự, '(x. (Y))' là một ô đối xứng với 'x' trong' ô' của nó, và danh sách '(y)' trong 'cdr' của nó - vì vậy nó giống như đọc' (xy) '. Vì vậy, khi bạn viết '(cộng với x. (Cdr t))', nó giống như khi bạn viết '(cộng với x cdr t)', điều này giải thích các kết quả khó hiểu mà bạn nhận được. –
Lưu ý rằng BTW có Racket có hệ thống cú pháp giúp phân biệt giữa hai loại và xử lý một biểu thức được nhập bằng '.' khác nhau - nhưng điều này không được thực hiện vì nó có thể dẫn đến sự nhầm lẫn lớn hơn tình huống. –