Можно ли ввести подсказку для массива Clojure, заполненного объектом deftype? - PullRequest
3 голосов
/ 23 декабря 2019

Я оптимизирую небольшой раздел приложения, ориентированный на производительность. Я пытаюсь создать массив Java типа, созданного с помощью deftype

(deftype MyThing [foo bar baz]) 

Тем не менее, я не могу найти какую-либо документацию о том, как ввести подсказку этих массивов, и без подсказки типа, отражение происходит.

(def my-array (make-array MyThing 10))
(aget my-array 0)

Выдает предупреждение:

Reflection warning, call to static method aget on clojure.lang.RT can't be resolved (argument types: core.MyThing, int).

Есть ли способ правильно подсказать тип?

1 Ответ

4 голосов
/ 23 декабря 2019

Я удивлен, что не нашел вопросов по этой теме, о переполнении стека, и еще более удивлен, увидев, что официальная документация по добавлению подсказок типов не покрывает это - я был уверен, что смогу закрыть это какдубликат или ссылка на официальную документацию, но здесь я набираю ее от руки, как варвар.

«Примитивная» версия подсказки типа, для которой другие формы являются просто сокращением 1 , это

^"Foo" xs

, где Foo - это внутреннее имя JVM для класса, который вы хотите намекнуть. Существуют сокращения для примитивных массивов (^ints xs) и для обычных типов классов (^MyType x), но это не распространяется на массивы не примитивных типов. Для этого вы должны знать официальное имя класса для вашего типа. Вы можете найти правила для этого, но самое простое, что нужно сделать, это просто спросить переводчика!

user=> (defrecord Foo [])
user.Foo
user=> (def foos (make-array Foo 10))
#'user/foos
user=> (class foos)
[Luser.Foo;
user=> (aget foos 0)
Reflection warning, null:1:1 - call to static method aget on clojure.lang.RT can't be resolved (argument types: unknown, int).
nil
user=> (aget ^"[Luser.Foo;" foos 0)
nil

1 На самом деле, еще более примитивным является ^{:tag "Foo"}, но этоРазличие не имеет значения для этого вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...