7

Tôi đang tìm một cái gì đó tương tự như arguments mảng javascript của:Làm thế nào để xác định một chức năng variadic

function parent(){ 
    child.apply(this.arguments); 
} 

Tôi nhận thức được những ký hiệu dấu chấm cho độ dài tranh luận biến và cũng có kế hoạch của apply chức năng.

này dường như không làm việc như dấu chấm được đưa đến là đối số đầu tiên:

(define (parent .) 
      (list .)) 

(parent 1 3 4 6 7) 
Error: bad argument count - received 5 but expected 1: #<procedure (array arg-list)> 

này hoạt động nhưng không phải là lý tưởng. Tôi muốn gọi hàm mà không có cú pháp phụ để xác định danh sách args:

(define (parent args-list) 
    (apply list args-list)) 


(parent 1 3 4 6 7) 
Error: bad argument count - received 5 but expected 1: #<procedure (array args-list)> 

(parent `(1 3 4 6 7)) 
(1 3 4 6 7) 

Trả lời

9

Cú pháp đúng là:

(define (parent . args-list) 
    <do something with args-list>) 

Sử dụng nó như thế này:

(parent 1 2 3 4 5) 

Bên trong thủ tục, tất cả các đối số sẽ bị ràng buộc vào một danh sách tên args-list. Trong đoạn mã trên, args-list sẽ có giá trị là '(1 2 3 4 5). Đây là một ví dụ về cách các hàm variadic hoạt động trong Sơ đồ.

Vì lợi ích của sự hoàn chỉnh, cơ chế tương tự có thể được sử dụng cho các chức năng mang tính chất quá (chú ý rằng args-listkhông bao quanh bởi dấu ngoặc đơn):

((lambda args-list <do something with args-list>) 1 2 3 4 5) 
3

Bạn muốn:

(define (parent . args) 
    args) ; args is a list 

Đó là Infact các 'mặc định' thi hành list.

(define (list . x) x) 

Thông báo lỗi khi áp dụng (define (parent .) ...) có vẻ sai, cũng không nên viết mã ở vị trí đầu vì cú pháp không hợp lệ. Có thể ngụ ý một lỗi với phiên bản Chicken Scheme bạn đang sử dụng.

Các vấn đề liên quan