ANSI Common Lisp có bignum
, có thể sử dụng để đại diện cho số tùy tiện lớn miễn là bạn có đủ không gian, nhưng nó không chỉ định một "vô cực " giá trị. Một số triển khai có thể, nhưng đó không phải là một phần của tiêu chuẩn.
Trong trường hợp của bạn, tôi nghĩ bạn phải suy nghĩ lại cách tiếp cận của mình dựa trên mục đích của hàm: tìm số lớn nhất trong danh sách. Tuy nhiên, cố gắng tìm số lớn nhất trong danh sách trống là không hợp lệ/vô nghĩa, vì vậy bạn muốn cung cấp cho trường hợp đó. Vì vậy, bạn có thể xác định điều kiện tiên quyết và nếu nó không được đáp ứng, hãy trả lại nil
hoặc tăng lỗi. Mà trên thực tế là những gì được xây dựng trong chức năng max
hiện.
(apply #'max '(1 2 3 4)) => 4
(apply #'max nil) => error
EDIT: Như đã chỉ bởi Rainer Joswig, Common Lisp không cho phép arbitrarily long argument lists, do đó cách tốt nhất là sử dụng reduce
thay vì apply
.
(reduce #'max '(1 2 3 4))
Cảm ơn. Tôi đã không nhận thức được tối đa mất một số tùy ý của các đối số, nhưng điều đó cung cấp một giải pháp thanh lịch. – jforberg
Vì các hàm trong Common Lisp không cho phép các danh sách đối số dài tùy ý, tốt nhất là thay thế APPLY bằng REDUCE. Xem giá trị của biến CALL-ARGUMENTS-LIMIT. Triển khai hỗ trợ tối đa CALL-ARGUMENTS-LIMIT danh sách đối số dài. Trong ví dụ của bạn, điều đó có nghĩa là việc triển khai có thể không tính toán tối đa trên danh sách dài CALL-ARGUMENTS-LIMIT + 1. Lưu ý rằng giá trị này của CALL-ARGUMENTS-LIMIT có thể nhỏ đến 50 (!). –
@RainerJoswig: Oh bạn hoàn toàn đúng. – Daimrod