diff --git a/NEWS.rst b/NEWS.rst index b84345e..7a523da 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -12,6 +12,7 @@ Bug Fixes ------------------------------ * Improved support for nesting anaphoric macros by only applying symbol replacement where absolutely necessary. +* Quoted f-strings are no longer evaluated prematurely. 0.18.0 ============================== diff --git a/hy/compiler.py b/hy/compiler.py index f219dac..3d527f7 100755 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -606,9 +606,15 @@ class HyASTCompiler(object): elif isinstance(form, HyString): if form.is_format: - body.extend([HyKeyword("is_format"), form.is_format]) + # Ensure that this f-string isn't evaluated right now. + body = [ + copy.copy(form), + HyKeyword("is_format"), + form.is_format, + ] + body[0].is_format = False if form.brackets is not None: - body.extend([HyKeyword("brackets"), form.brackets]) + body.extend([HyKeyword("brackets"), form.brackets]) ret = HyExpression([HySymbol(name)] + body).replace(form) return imports, ret, False diff --git a/tests/native_tests/language.hy b/tests/native_tests/language.hy index 7732207..903663e 100644 --- a/tests/native_tests/language.hy +++ b/tests/native_tests/language.hy @@ -1303,7 +1303,16 @@ cee\"} dee" "ey bee\ncee dee")) ; Format bracket strings (assert (= #[f[a{p !r :9}]f] "a'xyzzy' ")) (assert (= #[f-string[result: {value :{width}.{precision}}]f-string] - "result: 12.34"))) + "result: 12.34")) + + ; Quoting shouldn't evaluate the f-string immediately + ; https://github.com/hylang/hy/issues/1844 + (setv quoted 'f"hello {world}") + (assert quoted.is-format) + (with [(pytest.raises NameError)] + (eval quoted)) + (setv world "goodbye") + (assert (= (eval quoted) "hello goodbye"))) (defn test-import-syntax []