2009-03-28 26 views
27

Tha thứ cho tôi nếu tôi đang bị nguyền rủa, nhưng tôi hơi bối rối bởi tài liệu về nil ở Clojure. Nó nói:Clojure nil vs Java null?

nil có cùng giá trị như Java null.

Điều này có nghĩa là chúng giống nhau hay chúng khác nhau bằng cách nào đó? Và không một NullPointerException có nghĩa là một null Java đã gặp phải hoặc tôi cũng sẽ nhận được điều này nếu nil đã gặp phải?

Trả lời

21

Từ Learning Clojure

"Trong hầu hết các phương ngữ Lisp, có một giá trị bán tương đương với Java rỗng gọi là con số không. Trong Clojure, nil chỉ đơn giản là giá trị null Java, kết thúc của câu chuyện."

Kể từ khi Clojure biên dịch sang bytecode java, có vẻ như bất kỳ tham chiếu nào đến nil chỉ là tham chiếu đối tượng null trong JVM cơ bản. NPE của bạn từ việc thực hiện Clojure là kết quả của việc truy cập nil.

+0

Không nhất thiết. :-) Tôi cũng có một lớp java trong traceback. –

39

Từ mã nguồn Clojure, lang/LispReader.java:

static private Object interpretToken(String s) throws Exception{ 
    if(s.equals("nil")) 
     { 
     return null; 
     } 

Từ lang/RT.java:

static public void print(Object x, Writer w) throws Exception{ 
    { 
    ... 
    if(x == null) 
     w.write("nil"); 

Vì vậy nil là đại diện Clojure cho các nền tảng cơ bản của null. nil không hiển thị ở nơi nào khác trong nguồn Java cho Clojure. Sự khác biệt duy nhất giữa nilnull là một trong đó là Clojure và một là Java, nhưng chúng thực chất là bí danh, được chuyển đổi qua lại liên tục khi cần thiết bởi người đọc và máy in khi chuyển từ Clojure sang Java sang Clojure.

Vâng, nil có thể gây ra NullPointerException s. Thử gọi bất kỳ phương thức Java nào trên nil, bạn sẽ nhận được một NPE, ví dụ:

(.tostring nil) 

Mã nguồn Clojure khá dễ đọc khi nói đến những thứ như thế này, hãy cho nó xem.

+3

+1 để theo dõi nó trong mã nguồn – djhaskin987

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