2011-09-09 53 views
6

Trong Lisp chung, nếu tôi muốn kiểm tra xem một danh sách không phải là null, tôi chỉ có thể sử dụng danh sách như là điều kiện, vì tất cả các danh sách không phải là nil được coi là đúng. Tuy nhiên, tôi thấy rằng trong Đề án, làm như vậy sẽ làm cho Đề án nghĩ rằng tôi đang cố gắng gọi một hàm. Có cách nào tốt hơn để kiểm tra xem một danh sách có rỗng trong Đề án hay không để xác định một hàm khác là (not (null? x))?Cách tốt nhất để kiểm tra xem một danh sách không phải là null?

+0

Ý của bạn là gì 'sẽ làm cho Đề án nghĩ rằng tôi đang cố gọi một hàm'? – leppie

+0

@leppie Scheme phàn nàn nếu tôi sử dụng một danh sách (được chuyển thành tham số hàm) như một điều kiện. Tôi tra cứu đơn khiếu nại trên Google và rõ ràng Scheme đang cố gắng gọi hàm với tên của mục đầu tiên trong danh sách và vì chức năng đó không tồn tại, Đề án than phiền – wrongusername

+1

Âm thanh như bạn không trích dẫn danh sách, iow ' (1 2 3) 'vs' '(1 2 3) 'với cái sau là đúng. danh sách trống cũng cần phải được trích dẫn, iow ''()'. – leppie

Trả lời

7

Trong Đề án, mọi thứ không phải là #f là trung thực, do đó, '() được coi là #t trong câu hỏi if.

Như vậy,

(if '() "true" "false") => "true" 
(not '()) => #f 

Sử dụng (not (null? x)) là cách đơn giản nhất của việc kiểm tra nếu một danh sách không phải là null: nó mô tả chính xác những gì bạn muốn, và trong trường hợp góc nơi bạn đang đưa ra một cái gì đó không phải là một danh sách , nó sẽ cung cấp cho bạn hành vi khác nhau:

(if (not (null? #t)) "true" "false") => "true" 
(if (not #t) "true" "false") => "false" 
4

Nếu bạn biết rằng đó là danh sách, bạn có thể sử dụng (pair? x), vì mỗi danh sách là một cặp hoặc '().

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