Bất cứ ai có thể cho tôi biết cách làm việc với các thông số được lưu trữ trong giá trị được chỉ định bởi & nghỉ ngơi.Common Lisp: Làm việc với các tham số còn lại
Tôi đã đọc rất nhiều và dường như các tác giả chỉ biết cách liệt kê tất cả các tham số như vậy.
(defun test (a &rest b) b)
Điều này rất thú vị nhưng không thực sự hữu ích.
Điều tốt nhất tôi đã tìm thấy cho đến nay là sử dụng đầu tiên, thứ hai, v.v. để có được thông số bạn đang tìm kiếm.
(defun test (a &rest b)
(first b))
tôi nhận thấy phương pháp này ngừng hoạt động tại các tham số thứ mười, nhưng đặc điểm kỹ thuật (từ những gì tôi đã đọc) hỗ trợ tối thiểu là 50. Ngay cả khi rất có thể là mỏng mà tôi sẽ sử dụng 50 thông số, tôi muốn biết cách truy cập tất cả.
Cảm ơn
Đó là một danh sách bên trong hàm, nhưng việc chuyển danh sách thành & phần còn lại có thể không cung cấp cho bạn hành vi mà bạn muốn (trái với params [] từ ngôn ngữ C#). Khá dễ dàng đối với người mới bắt đầu (như bản thân tôi) để thực hiện sai lầm này: giả sử hàm của bạn đệ quy với tham số & tham số còn lại. Sau đó, trong quá trình đệ quy, bạn không thể chuyển danh sách thành tham số & tham số còn lại, bạn phải sử dụng # 'yourfun ... – PawelP
@PawelP Nếu bạn cần chuyển danh sách, thì chỉ cần sử dụng hàm param thông thường để chuyển danh sách đó. & tham số còn lại chỉ là một cách dễ dàng để gọi hàm với số biến số tham số mà không cần gói chúng trong danh sách trên mỗi trang gọi. – Marko
Điều gây hiểu lầm cho tôi là thực tế là * bên trong * chức năng, & tham số còn lại được truy cập giống như danh sách, tuy nhiên bạn không thể truyền trực tiếp nó như một tham số & phần còn lại đệ quy (vì bạn đang chuyển danh sách và có lẽ không phải những gì bạn muốn). Tôi nghĩ tôi không phải là người mới bắt đầu duy nhất rơi vào cái bẫy này. Vì vậy, có vẻ như LISP làm một số "đóng gói" đằng sau hậu trường về lời gọi hàm (làm cho một danh sách trong số các tham số được phân tích thành & phần còn lại) Tất nhiên giải thích của bạn là chính xác, tôi không tranh chấp điều đó. – PawelP