Какая разница между кавычкой и строкой в ​​этом случае с Clojure? - PullRequest
3 голосов
/ 08 мая 2011

Следующие две команды выводят одно и то же в repl:

user=> (println "(foo bar)")
(foo bar)
nil
user=> (println (quote (foo bar))
(foo bar)
nil

Итак, в чем же разница между кавычкой и строкой?

Edit: (+ 3 2) and (+ (quote 3) 2) одинаковы. В документах говорится, что цитата дает неоцененную форму (поэтому, возможно, я отвечаю на свой вопрос здесь, но, пожалуйста, проверьте), что цитата - это оптимизация с ленивой оценкой?

Ответы [ 2 ]

10 голосов
/ 08 мая 2011

Они действительно разные вещи:

user=> (class '(foo bar))
clojure.lang.PersistentList
user=> (class "foo bar")
java.lang.String

Даже если они могут иметь одинаковый результат println, они не одинаковы.

В остальном @bmillare прав: вы не quote для лени, вы цитируете, чтобы выразить литералы.

5 голосов
/ 08 мая 2011

Причина, по которой они выглядят одинаково, заключается в том, что println указывается для вывода содержимого строк и форм в кавычках, включая имя символов, на стандартный вывод. Если вы хотите напечатать формы так, как они выглядят при вводе в ридер, используйте prn (pr, если вы не хотите перевод строки)

 user=> (prn "(foo bar)")
 "(foo bar)"
 nil
 user=> (prn (quote (foo bar)))
 (foo bar)
 nil

По другому вопросу

Цитата - это не оптимизация с ленивой оценкой. Причина, по которой вы получаете (+ 3 2) и (+ (цитата 3) 2), заключается в том, что вы цитируете литерал, например, число, ключевое слово или строка. (http://clojure.org/reader) Литералы оцениваются во время чтения, прежде чем форма будет передана в верхнюю форму. Другой способ думать об этом - цитирование литералов просто определяется как тождество.

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