Я хотел бы предложить, чтобы избежать кавычки и обратные слэши . Я хотел бы пойти на одинарные кавычки, как JS разделители строк, как в Clojure вы обязаны использовать двойные кавычки используются для обозначения строк:.
;; Clojure
(eval-str (str "print(evaluateCode('"
(clojure.string/replace s #"(['\\\\])" "\\\\$1")
"'))"))
поиска и замены узоров каждая из которых имеет четыре обратных слэша Как и в Clojure обратной косой черты побег символа, они фактически обозначают только две обратные косые черты. В регулярных выражениях обратная косая черта - также escape-символ, поэтому в конце они просто обозначают один, буквальный обратный слэш каждый. Таким образом, это означает, что «префикс любого вхождения обратной косой черты или цитаты с обратной косой чертой».
Вы не должны беспокоиться о комментариях и шаблонах и т. Д., Поскольку escape-символы существуют только в Clojure (после замены), но решаются в момент, когда полная строка обрабатывается механизмом Javascript. Функция valuCode никогда не увидит escape-символы, но простое значение s.
Пример
;; Clojure
(def s "a = 'test'; // 'test' used here")
(eval-str (str "print(evaluateCode('"
(clojure.string/replace s #"(['\\\\])" "\\\\$1")
"'))"))
Это будет оценивать на:
(eval-str "print(evaluateCode('a = \\'test\\'; // \\'test\\' used here'))")
Обратите внимание, что обратные косые удваиваются в вышеупомянутом представлении, но это потому, что Clojure нуждается. Фактическая строка имеет только однократное появление обратных косых черт.Если вместо вызова eval-str
, вы могли бы назвать println
с теми же аргументами, вы получите этот результат:
печати (evaluateCode ('а = \' Test \ '; // \' \ 'тест, используемый здесь'))
это строка интерпретируется движком Javascript, поэтому он интерпретирует обратную косую черту, как экранирующих символов, передавая чистую строку evaluateCode.
Так что если evaluateCode выглядел следующим образом:
function evaluateCode(code) {
alert(code);
}
Он будет производить это предупреждение:
а = 'тест'; // 'test', используемый здесь
Таким образом, экранирующие обратные косые черты вообще отсутствуют в Javascript. Он увидит то же самое значение, что и символ Clojure s.
А как насчет того, чтобы избегать цитат типа « – Berger
», используйте другие кавычки? '' ', Потому что я думаю, что вы создаете новые строковые литералы таким образом –
@Berger Я думаю, что могут быть угловые случаи (строки шаблонов приходят на ум, возможно комментарии) – nha