Невозможно понять, как удалить строку, нельзя привести к clojure.lang.IFn из функции малого Clojure - PullRequest
0 голосов
/ 21 января 2020

У меня есть маленькая функция замыкания:

(defn split-legal-ref
  "Highly specific function that expects one AssessPro map and a map key,
   from which book and page will be extracted."
  [assess-pro-acct extract-key]
  (let [[book page] (cstr/split (extract-key assess-pro-acct) #"-")]
    (list (cstr/trim book) (cstr/trim page))))

Учитывая это: (extract-key assess-pro-acct) #"-"), значение extract-key равно :legal_ref. Таким образом, он извлекает одно значение типа 927-48 из карты и разделяет значение, используя '-'. Мне просто нужно поймать, когда нет одного из тех хороших значений. Вот где разбиение возвращает ноль.

Итак, я застрял, пытаясь заменить исходную функцию следующим.

(def missing-book 888)
(def missing-page 999)
.
.
.
(defn split-legal-ref
  "Highly specific function that expects one AssessPro map and a map key,
   from which book and page will be extracted."
  [assess-pro-acct extract-key]
    (let [[book page] (cstr/split (extract-key assess-pro-acct) #"-")]
     (let [[trimBook trimPage] ((if book (cstr/trim book) (missing-book))
                                        (if page (cstr/trim page)  (missing-page)))]
        (list (trimBook) (trimPage)))))

Проблема в том, что я продолжаю получать страшную

String cannot be cast to clojure.lang.IFn From Small Clojure Function

ошибку. Как я могу реструктурировать эту функцию, чтобы избежать ошибки?

Опубликовать ответы Редактировать:

Спасибо за ответы:

Я переработал функцию, чтобы проверить наличие «-» в строке. Если его там нет, я использую фиктивный "888-99" в качестве значения, когда его там нет.

(def missing-book-page "888-99")
.
.
.

(defn split-legal-ref
  "Highly specific function that expects one AssessPro map and a map key,
   from which book and page will be extracted."
    [assess-pro-acct extract-key]
    (let [[book page] 
            (if (.contains "-" (extract-key assess-pro-acct))
            (cstr/split (extract-key assess-pro-acct) #"-")
            (cstr/split  missing-book-page #"-"))]
        (list (cstr/trim book) (cstr/trim page))))

Ответы [ 2 ]

5 голосов
/ 22 января 2020

У вас есть дополнительный набор скобок вокруг выражения, начинающегося с ((if book .... Выражение if возвращает строку, а затем, поскольку эта строка находится в первой позиции списка с внешней из этих двух скобок, Clojure пытается вызвать строку как функцию.

Скобки очень очень важно в Clojure. В отличие от арифметических c выражений в таких языках, как Fortran, C, C ++, Java, Python и др. c., Где добавление дополнительного набора скобок вокруг подвыражения является избыточным и, возможно, плохим стилем, но безвредный, он меняет смысл выражений Clojure.

1 голос
/ 22 января 2020

Можете ли вы добавить дополнительную информацию, например, имена функций и примеры данных? Также включите больше сообщений об ошибках.

Где-то в вашем коде вы пытаетесь использовать строку, как если бы она была функцией. Например:

("hello" 3)  ; should be (inc 3) or something.  This is line #6 

Это приводит к следующей ошибке

ERROR in (dotest-line-5) (core.clj:6)
Uncaught exception, not in assertion.
expected: nil
  actual: java.lang.ClassCastException: class java.lang.String cannot be cast to class clojure.lang.IFn (java.lang.String is in module java.base of loader 'bootstrap'; clojure.lang.IFn is in unnamed module of loader 'app')
 at tst.demo.core$fn__18295.invokeStatic (core.clj:6)
<snip>

Обратите внимание, что последняя строка вышеуказанной ошибки относится к core.clj:6, что соответствует пространству имен tst.demo.core и номеру строки 6 где (hello 3) находится в исходном коде.

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