В чем разница между read-string и load-string в clojure? - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть следующая форма:

((read-string "+") 2 3)

Возвращает 3

У меня есть два вопроса по этому поводу:

1)Почему в приведенной выше форме возвращается 3 вместо nil, исключение или что-то еще?Как именно эта форма разрешается?2) Что в этом случае возвращается от read-string?И чем он отличается от того, что я использовал load-string?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

То, что вы на самом деле делаете, - это использование символа в качестве функции и передача ему аргументов.Вы можете прочитать связанные вопросы и ответы , которые описывают это более подробно.Из ответа:

Теперь символы можно использовать в качестве функций (они реализуют интерфейс clojure.lang.IFn), но способ, которым они действуют при использовании таким образом, заключается в том, что они ищут себя в своихаргумент, то есть обработайте их аргумент как карту и выполните поиск внутри нее

Как указано в ответе @ akond, read-string возвращает символ, а load-string также оценивает его.Вы можете запустить то же поведение, передав любой другой символ:

((symbol 'hi) 2 3)
;; 3
('foo 2 3)
;; 3
('foo '{foo 2} 3)
;; 2
('foo 2)
;; nil since there is no default value provided

Если вам интересно, вы можете взглянуть на Реализация символа в исходном коде Clojure.

0 голосов
/ 04 декабря 2018

(read-string "+") возвращает символ +, который может быть разрешен или оценен для получения фактического значения, то есть функция +.

load-string возвращает результат выражения.

Другими словами load-string равно (eval (read-string "+"))

Вы не получите ноль или исключение, потому что язык делает оценку за вас.

  1. Компилятор разрешает символ + для оценки выражения.
  2. + символ разрешается в # 'clojure.core / + в соответствии с текущими псевдонимами пространства имен, поскольку псевдонимы ядра всегда доступны.

    (class (read-string "+"))
    ; => clojure.lang.Symbol
    (class (resolve (read-string "+")))
    ; => clojure.lang.Var
    (class (deref (resolve (read-string "+"))))
    ; => clojure.core$_PLUS_`
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...