Có identity
"trả lại đối số"?
Điều đó tùy thuộc vào ý bạn của đối số .
- Nếu đó là biểu thức đánh giá theo hình thức chức năng gọi, sau đó không phải lúc nào.
- Nếu nó là nội dung của hàm nhìn thấy trên ngăn xếp khi nhập, sau đó có, nó.
Sự bất thường phát sinh do cách Clojure gọi hàm.
- Chức năng clojure là các đối tượng tuân thủ the
IFn
interface.
- Lệnh gọi hàm Clojure được dịch sang một trong nhiều phương thức
invoke
- quá tải cho tính chất - của đối tượng hàm.
- Tất cả các phương pháp
invoke
có thông số Object
.
Kết quả cuối cùng của tất cả điều này là tất cả các chức năng Clojure gọi dịch của nó mỗi đối số vào một số loại Object
- một hoạt động bản sắc ngoại trừ trên nguyên thủy, được bọc trong lớp Java tương ứng: long
vào Long
, và vân vân .
Vì vậy, ngay cả chức năng identity
, về cơ bản là (defn identity [x] x)
, không trả lại một đối số nguyên thủy. Nó không thể, bởi vì nó không bao giờ nhìn thấy nó.
Ví dụ, chúng ta hãy xem xét các biểu hiện
(inc 3)
Số 3
chắc chắn là một long
. Loại (inc 3)
là gì? Hãy hỏi Clojure:
(type (inc 3))
=> java.lang.Long
... một đóng hộpLong
đối tượng.
Hằng ngày, chúng ta chắc chắn rằng 3
là một nguyên thủy long
:
(type 3)
=> java.lang.Long
Aaaaaaagh! Nó được đóng hộp quá!
Không nhất thiết phải! Bạn không thể biết được, bởi vì khi cơ thể của type
thấy 3
, nó là được đóng hộp, cho dù nó có được đọc cho người đọc/trình biên dịch hay không. Các Clojure documentation là im lặng vào thời điểm này. Nó chỉ nói rằng các chữ số là thường được biểu diễn theo Java.
Vì vậy - nói chung - đó là cơ chế đánh giá, không phải là một chức năng cụ thể (chẳng hạn như identity
) chịu trách nhiệm về các đối số nguyên thủy đấm bốc. Đây là auto-boxing.
gì ví dụ của bạn hiển thị là nguyên thủy được tổ chức như vậy, un-đóng hộp, ít nhất là trong let
hình thức:
(let [x 1.0] (identical? x x)) ;=> false
(let [x (identity 1.0)] (identical? x x)) ;=> true
Thực tế là identical?
có khả năng phân biệt giữa hai Phòng riêng của 1.0
cho thấy rằng nó được tổ chức như một nguyên thủy double
. (Tôi đã sử dụng thông thường double
, chỉ để cho thấy rằng hành vi không liên quan gì đến giá trị đặc biệt Double/NaN
).
Bây giờ chúng ta hãy thử đặt số lượng trong một var:
(def x 1.0)
(identical? x x) ;=> true
(let [x (identity x)] (identical? x x)) ;=> true
Nó đóng hộp.
Trong khi chúng tôi đang ở đây, auto-boxing là idempotent:
(identical? x (identity x)) ;=> true
Trên đây thêm chút với những gì Alan Thompson's và Josh's câu trả lời và Alan Malloy và ý kiến của Lee bao gồm. Tôi chỉ cảm thấy họ đã nối và chơi cá, mà không thực sự hạ cánh nó.
Điều này có thể do quyền anh - 'Double/NaN' trả về một số nguyên 'double' được đóng hai lần trong ví dụ đầu tiên nhưng chỉ một lần trong giây. – Lee