2011-12-12 13 views
5

Tôi đang tìm cách tiêu chuẩn để biểu diễn vô cực âm trong Lisp. Có một giá trị symblic được công nhận bởi các hàm số học của Lisp ít hơn tất cả các số khác không?Phủ định vô cực trong Lisp

Cụ thể, tôi đang tìm kiếm một cách thanh lịch để viết như sau:

(defun largest (lst) 
    "Evaluates to the largest number in lst" 
    (if (null lst) 
    ***negative-inifinity*** 
    (max (car lst) (largest (cdr lst))))) 

Trả lời

7

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)) 
+0

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

+4

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 (!). –

+0

@RainerJoswig: Oh bạn hoàn toàn đúng. – Daimrod

3

Không có gì như thế trong ANSI Common Lisp là. Các triển khai Lisp thường gặp (và thậm chí cả các ứng dụng toán học) khác nhau về sự biểu diễn của chúng về vô cực âm.

Ví dụ trong LispWorks cho nổi kép:

CL-USER 23 > (* MOST-NEGATIVE-DOUBLE-FLOAT 10) 
-1D++0