почему записи не являются функциями? - PullRequest
0 голосов
/ 05 февраля 2019

В отличие от карт, записи не являются функциями.Почему?

;; maps are functions of the keys
({:a 1} :a) ;; 1
({:a 1}) ;; error
({:a 1} 1) ;; nil

;; records? no, records are not functions
(defrecord T [t])
((->T 1) :t) ;; error: T cannot be cast to clojure.lang.IFn
(:t (->T 1)) ;; 1

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Другие ответили на это, но вот как вы заставляете один из ваших типов defrecord реализовывать интерфейс IFn:

user> (defrecord Blah
          [x y]

        clojure.lang.IFn
        (invoke [o arg] (arg o)))

user> (let [obj (->Blah 1 2)]
        [(obj :x) (obj :y)])
[1 2]
0 голосов
/ 05 февраля 2019

В deftype и defrecord Рич пишет: « defrecord обеспечивает полную реализацию постоянной карты ... ».Значит, записи должны работать как функции?

НЕТ.IPersistentMap, интерфейс для постоянных карт, не реализует IFn, интерфейс для функций Clojure.

Однако согласованность была бы хорошей: преобразование карт в записи должно вызывать как можно меньше сюрпризов.Сказав, что ...

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

Надеюсь, это извращение помогает.

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