diff --git a/hy/compiler.py b/hy/compiler.py index 48d8af4..3d527f7 100755 --- a/hy/compiler.py +++ b/hy/compiler.py @@ -606,7 +606,13 @@ 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]) 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 []