Thanks, but it seems that I have found the source of problem, though I do 
not know why compiler message is so uninformative and misleading.

The following code does not work (fails with CompilerException 
java.lang.VerifyError: (class: test/Test2Impl, method: fail signature: ()V) 
Expecting to find integer on stack):

(definterface Test2
  (^void fail []))

(deftype Test2Impl
  [^{:unsynchronized-mutable true :tag int} x]
  Test2
  (fail [this]
    (set! x (dec x))))

The following code _does_ work:

(definterface Test2
  (^void fail []))

(deftype Test2Impl
  [^{:unsynchronized-mutable true :tag int} x]
  Test2
  (fail [this]
    (set! x (int (dec x)))))

Note that I have wrapped (dec x) into (int). This compiles and works 
flawlessy.

In fact it is fine that there is an error here because (dec) is defined 
only on objects and longs, so supplying int to it does not work as 
intended. Even my first example in this message will work if you replace 
:tag int with :tag long.
However, error message is absolutely misleading and seems to be a 
consequence of an error in the compiler...



вторник, 18 декабря 2012 г., 23:18:28 UTC+4 пользователь David Nolen 
написал:
>
> Oops, looking over gvec.clj it looks like I'm wrong about type-hinting 
> fields. However you may need to type-hint the primitive array with a string 
> instead of the symbol shorthand allowed by Clojure. Try the following:
>
> ^{:tag "[I" :unsynchronized-mutable true}
>
> David
>
>
> On Tue, Dec 18, 2012 at 1:46 PM, Vladimir Matveev 
> <dpx.in...@gmail.com<javascript:>
> > wrote:
>
>> Well, it is news for me since it is not documented anywhere. Why is this 
>> so? BTW, typehinting value in '(let [value (aget data depth)]' binding 
>> gives an error "Can't type hint a local with a primitive initializer" so I 
>> think since this value considered primitive then I actually can hint the 
>> fields to be primitive arrays.
>> Nonetheless, it does not look like that problem is in the field array: 
>> wrapping aget form with (int) does not help.
>>
>> вторник, 18 декабря 2012 г., 17:46:14 UTC+4 пользователь David Nolen 
>> написал:
>>
>>> I don't think you can type hint a field as a primitive array.
>>>
>>> On Tuesday, December 18, 2012, Vladimir Matveev wrote:
>>>
>>>> Hello,
>>>>
>>>> Consider the following code
>>>>
>>>> (gen-interface
>>>>   :name IntStack
>>>>   :methods [[stackPeek [] int]
>>>>             [stackPush [int] void]
>>>>             [stackPop [] int]
>>>>             [stackDepth [] int]])
>>>>
>>>> (deftype IntStackImpl
>>>>   [^{:tag ints :unsynchronized-mutable true} data
>>>>    ^{:tag int :unsynchronized-mutable true} depth]
>>>>   IntStack
>>>>   (stackPeek [this]
>>>>     (aget data depth))
>>>>   (stackPush [this value]
>>>>     (when (>= (inc depth) (alength data))
>>>>       (let [data-length (alength data)
>>>>             new-data (int-array (* data-length 2))]
>>>>         (System/arraycopy data 0 new-data 0 data-length)
>>>>         (set! data new-data)))
>>>>     (set! depth (inc depth))
>>>>     (aset data depth value))
>>>>   (stackPop [this]
>>>>     (if (> depth 0)
>>>>       (let [value (aget data depth)]
>>>>         (set! depth (dec depth))
>>>>         value)
>>>>       (throw (IllegalStateException. "Stack is already empty!"))))
>>>>   (stackDepth [this]
>>>>     depth))
>>>>
>>>> This is very simple stack implementation over plain java array. It does 
>>>> not compile with the following message:
>>>> CompilerException java.lang.VerifyError: (class: 
>>>> clojure/data/xml/IntStackImpl, method: stackPop signature: ()I) Expecting 
>>>> to find integer on stack
>>>>
>>>> However, when I replace the body of stackPop with, say, plain zero 
>>>> literal 0, the method seems to pass the compilation, because then I'm 
>>>> getting similar error on stackPush method instead.
>>>> Placing type hints inside stackPop method does not work (in fact, it is 
>>>> even an error to place them, say, on value local binding).
>>>>
>>>> What am I doing wrong here? How to make the class compile?
>>>>
>>>> Cheers,
>>>> Vladimir.
>>>>
>>>>
>>>>  -- 
>>>> You received this message because you are subscribed to the Google
>>>> Groups "Clojure" group.
>>>> To post to this group, send email to clojure@googlegroups.com
>>>> Note that posts from new members are moderated - please be patient with 
>>>> your first post.
>>>> To unsubscribe from this group, send email to
>>>> clojure+unsubscribe@**googlegroups.com
>>>> For more options, visit this group at
>>>> http://groups.google.com/**group/clojure?hl=en<http://groups.google.com/group/clojure?hl=en>
>>>
>>>  -- 
>> You received this message because you are subscribed to the Google
>> Groups "Clojure" group.
>> To post to this group, send email to clo...@googlegroups.com<javascript:>
>> Note that posts from new members are moderated - please be patient with 
>> your first post.
>> To unsubscribe from this group, send email to
>> clojure+u...@googlegroups.com <javascript:>
>> For more options, visit this group at
>> http://groups.google.com/group/clojure?hl=en
>>
>
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to