2017-07-23 39 views
6

Bir int dizisi def ise ve dizideki bir öğeyi Long ile ayarladıktan sonra, herhangi bir şikayetin bulunmadığını fark ettim. Ancak int dizisini bir let bloğuna bağlarsam, Uzun olan bir öğe ayarladığınızda, bir Geçersiz Klasör istisnası atılır. Birisi bunun neden olduğunu anlamama yardımcı olabilir mi?Int dizileri 'def' ile bağlı neden niçin Clojure'da uzun değerler kabul edilir?

Aşağıdaki kod tutarsızlığı göstermektedir. Hem Clojure 1.8'de hem de 1.9'un en yeni beta sürümünde denedim ve bu sonuçları aldım. tür kesmesi let meydana çünkü

(def a (int-array 10)) 
(aset a 0 Long/MAX_VALUE) ;; sets first element to -1 

(let [b (int-array 10)] 
    (aset b 0 Long/MAX_VALUE)) ;; throws java.lang.IllegalArgumentException: Value out of range for int: 

cevap

9

Bu tutarsızlık değil def yılında, kaynaklanır. Etrafa durum geçiş tipi ipuçlarını kullanarak doğrulayabilirsiniz:

(def ^"[I" a (int-array 10)) 
(aset a 0 Long/MAX_VALUE) 
;; throws java.lang.IllegalArgumentException: Value out of range for int: 

(let [^Object b (int-array 10)] 
    (aset b 0 Long/MAX_VALUE)) 
;; sets first element to -1 

Veya alternatif olarak:

(def a (int-array 10)) 
(aset ^"[I" a 0 Long/MAX_VALUE) 
;; throws java.lang.IllegalArgumentException: Value out of range for int: 

(let [b (int-array 10)] 
    (aset ^Object b 0 Long/MAX_VALUE)) 
;; sets first element to -1 

Bu, tüm bu davaları içerdiğinden Clojure inlines calls to aset when possible, ama inlined statik yöntem çağrısı has many overloads .

+0

Öğeyi '-1' olarak ayarlamak bana bir hata gibi görünüyor: sessizce * denetlenmiyor * aritmetik. – Thumbnail

+0

@Thumbnail Katılıyorum; [CLJ-1142] ile aynı satırda bir hata gibi görünüyor (https://dev.clojure.org/jira/browse/CLJ-1142). –

İlgili konular