Tôi đang cố gắng lấy Lisp làm ngôn ngữ mới của mình, và tôi đang gặp một số vấn đề về cách thực hiện các phần của hàm hoạt động trên mỗi phần tử của danh sách được truyền cho nó.defun với một danh sách như là đối số
Đối với mục đích của việc học làm thế nào để làm được việc này, tôi đang cố gắng để viết một hình thức khá cơ bản của bộ phận không tiếng kêu khi một trong những yếu tố của danh sách là 0 (nhưng thay vì chỉ trả về 0)
(defun divtest (elements)
(dolist (x elements)
(if (zerop x) 0())
(/ elements)))))
tôi cố gắng chạy này như:
(divtest '(20 2 5))
nào mang lại:
*** - /: (20 2 5) is not a number
Điểm thất bại dường như bắt nguồn từ thực tế là tôi không "giải nén" các phần tử trong danh sách trước khi chuyển chúng đến hàm (trong trường hợp này, không phải/cũng không phải là dolist hoạt động như dự định, vì x không bao giờ đánh giá 0). Nếu tôi đúng, ai đó có thể cho tôi biết cách thực hiện "trích xuất" này?
Lưu ý: Câu hỏi này có liên quan đến one that I've asked earlier, nhưng như tôi không rõ ràng về những phần của câu trả lời trước thực sự cho phép nó hoạt động như dự định với vấn đề cụ thể này tôi quyết định đi sâu hơn vào những điều cơ bản
sử dụng REDUCE thay vì ÁP DỤNG –
Chỉ tò mò: tiện ích đó sẽ là gì? – Hugh
theo cách này bạn có thể xử lý các danh sách dài tùy ý và không chỉ các danh sách dài CALL-ARGUMENT-LIMIT (độ dài CL chuẩn). Lisp thông thường có số lượng đối số phụ thuộc thực hiện tối đa. Con số này phải từ 50 trở lên. Điều này có nghĩa là việc triển khai thực hiện chỉ cần hỗ trợ 50 đối số (hoặc nhiều hơn). Vì vậy, hàm trên của bạn có thể thất bại trong một số triển khai trong đó danh sách các số dài hơn số đối số gọi hàm/cho phép. –