2016-01-27 3 views
4

У меня есть код в файлах cljc, который компилируется как для Clojure, так и для ClojureScript.Доступ к методам defrecord в ClojureScript Figwheel

в protocols.cljc

(defprotocol Transformable ".." 
    (scale [this scalar] "") ...) 

в pattern.cljc

(defrecord APattern [paths] 
    Transformable 
     (scale [this s] (...)) ...) 

в another.cljc

(defn f [pattern] (.scale pattern (/ 1 2))) 

И в core.cljs

(another/f pattern) 

Однако я получаю сообщение об ошибке на консоли браузера

TypeError: pattern.scale is not a function 

Проверка полей объекта шаблона в core.cljs (с помощью JS-клавиши) показывает мне, что объект, что называется

"patterning$protocols$Transformable$scale$arity$2" 

который выглядит как моя функция. Так что я просто делаю что-то не так, чтобы получить доступ к нему в ClojureScript? Делает. нотация не работает? Нужно ли мне что-то делать?

+0

У вас есть эта проблема как в режиме разработки, так и в производстве? –

+0

Я все еще только в режиме разработки. – interstar

ответ

2

Звонки на функции протокола аналогичны вызовам любой другой функции. Таким образом, ваша функция f должна выглядеть так:

(require 'protocols) 
(defn f [pattern] (protocols/scale pattern (/ 1 2))) 
+0

Проблема заключается в том, что я пытаюсь написать библиотеку, которая может использоваться как в браузере с ClojureScript, так и с помощью Java. Причина, по которой я перешел в defprotocol, и .notation заключается в том, что я надеялся, что смогу сделать Java-совместимые API без необходимости писать обертку. Вы говорите, что это невозможно? – interstar

+0

Также, когда я попробую версию вашего предложения (в cljs (protocol/scale pattern 0.5), теперь он говорит: «p1__25094_SHARP_.scale не является функцией» – interstar

+0

Функция 'f' является функцией Clojure, поэтому, если вы хотите использовать это из Java, вы уже находитесь в clojureland, поэтому протоколы/масштаб - это правильный способ его использования. Если вы хотите повторно использовать запись Pattern из Java, тогда вы будете использовать синтаксис Java: 'new pattern.APattern ("") .scale ("bar"); 'который полностью не связан с функцией' f' – DanLebrero

Смежные вопросы